gpt4 book ai didi

sql-server - 如何检查 SQL Server 表是否是系统表

转载 作者:行者123 更新时间:2023-12-02 11:14:09 26 4
gpt4 key购买 nike

使用存储过程sp_msforeachtable可以对数据库中的所有表执行脚本。

但是,我想从中排除一些系统表。本能地,我会检查属性 IsSystemTableIsMSShipped 。这些并不像我预期的那样工作 - 例如,我有一个名为 __RefactorLog 的表:

System table

但是当我查询这是系统表还是 MS 运送表时,SQL Server 报告我的表都不是系统表:

exec (N'EXEC Database..sp_msforeachtable "PRINT ''? = '' + CAST(ObjectProperty(Object_ID(''?''), ''IsSystemTable'') AS VARCHAR(MAX))"') AS LOGIN = 'MyETLUser'
-- Results of IsSystemTable:
[dbo].[__RefactorLog] = 0
[schema].[myUserTable] = 0

exec (N'EXEC Database..sp_msforeachtable "PRINT ''? = '' + CAST(ObjectProperty(Object_ID(''?''), ''IsMSShipped'') AS VARCHAR(MAX))"') AS LOGIN = 'MyETLUser'

-- Results of IsMSShipped:
[dbo].[__RefactorLog] = 0
[schema].[myUserTable] = 0

当我查看表的属性(SSMS 内部)时,该表被标记为系统对象。类似 IsSystemObject 的对象属性但不存在(据我所知)。

除了对象属性之外,如何检查表是否是系统对象? SSMS 如何检查表是否是系统对象?

最佳答案

在对象资源管理器中打开“系统表”文件夹时,Management studio 2008 似乎运行了一些相当丑陋的以下代码,关键点似乎是:

CAST(
case
when tbl.is_ms_shipped = 1 then 1
when (
select
major_id
from
sys.extended_properties
where
major_id = tbl.object_id and
minor_id = 0 and
class = 1 and
name = N''microsoft_database_tools_support'')
is not null then 1
else 0
end
AS bit) AS [IsSystemObject]

(其中 tblsys.tables 的别名)

因此,它似乎是一个组合 - 要么 sys.tables 中的 is_ms_shipped 为 1,或者具有特定的扩展属性集。

关于sql-server - 如何检查 SQL Server 表是否是系统表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10029979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com