10

ストアド プロシージャを使用するsp_msforeachtableと、データベース内のすべてのテーブルに対してスクリプトを実行できます。

ただし、そこから除外したいシステムテーブルがあります。IsSystemTable本能的に、私はプロパティまたはをチェックしますIsMSShipped。これらは期待どおりに機能しません-たとえば、次のようなテーブルがあります__RefactorLog

システム テーブル

しかし、これがシステム テーブルか MS Shipped テーブルかをクエリすると、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は存在しません(AFAIK)。

オブジェクト プロパティとは別に、テーブルがシステム オブジェクトであるかどうかを確認するにはどうすればよいですか? テーブルがシステムオブジェクトであるかどうかをSSMSはどのようにチェックしますか?

4

4 に答える 4

12

Management Studio 2008は、オブジェクトエクスプローラーで「SystemTables」フォルダーを開くと、非常に醜い次のコードを実行しているようです。重要な点は次のようです。

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]

tbl(のエイリアスはどこにありますかsys.tables

つまり、1であるか、特定の拡張プロパティセットを持っているis_ms_shippedかのいずれかの組み合わせのようです。sys.tables

于 2012-04-05T14:05:59.517 に答える
2

__refactorlog は、SSMS が提案するものとは対照的に、ユーザー テーブルです。テーブルの名前変更など、現在のデータベースの状態から推測できないスキーマの変更を追跡するために、展開中に使用されます。

他のすべてのユーザー テーブルがカスタム (非 dbo) スキーマにある場合は、isMSshipped/isSystemTable 属性とスキーマ名の組み合わせを使用して、テーブルがスクリプトの「スコープ内」にあるかどうかを判断できます。

于 2012-04-05T17:29:41.260 に答える
1

In the past I've worked on the assumption that, in the sys.objects table, column is_ms_shipped indicates whether an object is or is not a system object. (This column gets inherited by other system tables, such as sys.tables.)

This flag can be set by procedure sp_ms_markSystemObject. This, however, is an undocumented procedure, is not supported by Microsoft, I don't think we're supposed to know about it, so I didn't tell you about it.

于 2012-04-05T14:06:53.307 に答える
0

何か不足していますか?

ただし、そこから除外したいシステムテーブルがあります

少なくとも SQL Server 2008 では、次の抜粋が示すように、システム テーブルはsp_MSforeachtable 既に除外されています。

+ N' where OBJECTPROPERTY(o.id, N''IsUserTable'') = 1 ' + N' and o.category & ' + @mscat + N' = 0 '
于 2012-04-05T14:15:13.053 に答える