web-dev-qa-db-ja.com

sys.objects、sys.system_objects、sys.sysobjectsを理解していますか?

この質問ではsys.sysobjectsを使用してクエリを作成していました。ただし、回答の1つはsys.system_objectsです。これらのテーブルの違いは何ですか?

  • sys.objects
  • sys.system_objects
  • sys.sysobjects

sysobjectsには他にもあります。

> SELECT count(*) FROM sysobjects;
2312

> SELECT count(*) FROM sys.system_objects;
2201

> SELECT count(*) FROM sys.objects;
> 111

SELECT count(*)
FROM sys.sysobjects
WHERE NOT EXISTS (
  SELECT 1
  FROM sys.system_objects
  WHERE system_objects.object_id = sysobjects.id
);
> 111
6
Evan Carroll

マイクロソフトパーランス

Microsoftを起動するには、このディスカッションに関連する3つのカテゴリがあります。

  • システムベーステーブル 、_SYSTEM TABLE_、またはカタログテーブル「システムオブジェクト」を格納します。これらには、直接アクセスのためにDACが必要です。
  • システムカタログビュー これは、Microsoft辞書に多数の名前付きサブカテゴリがあり、このディスカッションに関連する唯一のものは オブジェクトカタログビュー 。 _INFORMATION_SCHEMA_は、ISOの標準化されたシステムカタログビューと考えることができます。
  • 互換性ビュー 、厳密に言えば、その使用が明示的に廃止されているレガシーレイヤー。

応用

  • _sys.sysschobjs_ 、_SYSTEM TABLE_、SQL Serverのすべてのオブジェクトがこのシステムテーブルに表示されます。このシステムテーブルには、内部ビット文字列を取得してbit列に展開する_sys.sysschobjs$_という独自のビューがあります。 _sys.sysschobjs$_に対して結合する_sys.syspalnames ON syspalnames.class = 'OBTY'_からプルする2つのカタログビューは、

    • _sys.system_objects_ 、_OBJECT CATALOG VIEW_。 Microsoftによって承認され、システムとして指定され、sysスキーマへのインストールによって識別されます。彼らは、用語で明示的な「システム」修飾子を取得します。内部的にはこれはhas_access('CO', o.id)です

    • _sys.objects_ 、_OBJECT CATALOG VIEW_。他のすべてのオブジェクトは、暗黙的な非システムオブジェクトです。 objects(システムオブジェクトと並置)が表示されたら、非システムオブジェクトと考えてください。内部的にはこれはhas_access('SO', o.id)です

  • _sys.sysobjects_ 、互換性ビュー。ここでのsysの指定は、ビュー自体がsys以外のオブジェクトをプルするときに扱いにくいため、一見誤った名前が付けられています。私はかつて、システムオブジェクトと非システムオブジェクトの間に指定がなく、すべてsysobjectsであったと思います。これで指定ができたので、これは「互換性ビュー」になりました。 他の回答はこれが_UNION ALL_であり、厳密に言えば正しくないことを示唆していますが、

    • _sys.sysschobjs_を直接クエリし、uidなどの他のカタログビューが削除した情報を提供します。
    • 内部的にはこれはhas_access('MO', id)です(まだ影響は不明です)
    • typeuserstat、およびsystatはすべてここに追加されており、互換表示がcategoryと呼ぶものは非常に奇妙で、おそらく他の場所では使用されていません。 xtypeは_sys.sysschobjs$_の純粋なタイプです

脚注

schsysschobjsはスキーマを表すと思います。これはもう1つのアンチニーモニックです。sysスキーマにないものを格納するため、忘れてください。そのためには_sys.system_objects_が必要です。

2
Evan Carroll

以前の投稿で述べたように、sys.sysobjectsは非推奨です。

sys.sysobjects(Transact-SQL) から取得

このSQL Server 2000システムテーブルは、下位互換性のためのビューとして含まれています。代わりに、現在のSQL Serverシステムビューを使用することをお勧めします。同等のシステムビューを見つけるには、 システムテーブルのシステムビューへのマッピング(Transact-SQL) を参照してください。この機能は、Microsoft SQL Serverの将来のバージョンで削除される予定です。新しい開発作業ではこの機能の使用を避け、この機能を現在使用しているアプリケーションの変更を計画してください。

sys.system_objectssys.objectsを組み合わせて、廃止されたsys.sysobjectsシステムテーブルに格納されているすべてのアイテムを取得する必要があります。

SELECT * FROM sys.system_objects 
UNION ALL
SELECT * FROM sys.objects AS o

結果:

(2171 row(s) affected)
  • sys.system_objects

    Microsoft SQL Serverに含まれているすべてのスキーマスコープのシステムオブジェクトの1行が含まれます。すべてのシステムオブジェクトは、sysまたはINFORMATION_SCHEMAという名前のスキーマに含まれています。

  • sys.objects

    ネイティブにコンパイルされたスカラーのユーザー定義関数を含む、データベース内で作成された各ユーザー定義のスキーマスコープオブジェクトの行が含まれます

たとえば、sp_MScleanupmergepublisherìs_ms_shippedですが、sysschema(dboにあります)にはないため、sys.objectsにあり、sys.system_objectsではありません。これはおそらくsys.sp_MScleanupmergepublisher_internalのシェルであり、おそらくインスタンスの作成時に定義されているためです。 SSMSを使用している場合は、dbo.sp_MScleanupmergepublisherシステムストアドプロシージャを右クリックし、Modifyを選択します。

USE [master]
GO
/****** Object:  StoredProcedure [dbo].[sp_MScleanupmergepublisher]    Script Date: 19.12.2017 12:12:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER procedure [dbo].[sp_MScleanupmergepublisher]
as
    exec sys.sp_MScleanupmergepublisher_internal
11

ここに違いがあります:

  • _sys.sysobjects_は、古いSQL Server 2000システムテーブル(互換ビュー)です。 MicrosoftはSQL Server 2005から、互換ビューの代わりにカタログビューと呼ばれる新しいビューのセットを導入しました。互換性ビューは下位互換性のためにSQL Serverに残っています(Microsoftは一部の内部コードを壊さないように古いビューを残すことにしました)。

  • _sys.system_objects_はカタログビューです。これを実行することでオブジェクト定義を確認できます:SELECT OBJECT_DEFINITION(OBJECT_ID('sys.system_objects'))

カタログビュー内で、システムテーブル_sys.sysschobjs_を使用していることがわかります。

_CREATE VIEW sys.system_objects 
AS   
SELECT o.name,    
o.id AS object_id,    
convert(int, null) AS principal_id,    
o.nsid AS schema_id,    convert(int, 0) AS parent_object_id,    
o.type,    
n.name AS type_desc,    
o.created AS create_date,    
o.modified AS modify_date,    
convert(bit, 1) AS is_ms_shipped,    
convert(bit, 0) AS is_published,    
convert(bit, 0) AS is_schema_published   
FROM sys.sysschobjs o   
LEFT JOIN sys.syspalnames n ON n.class = 'OBTY' AND n.value = o.type   WHERE has_access('SO', o.id) = 1 _

_sys.objects_から抽出すると、_sys.sysschobjs_を見つけることができます

_SELECT name, type_desc FROM sys.objects
WHERE name = 'sysschobjs' _

以下のシステムテーブルにアクセスするにはDACが必要です

_+------------+--------------+
| name       | type_desc    |
+------------+--------------+
| sysschobjs | SYSTEM_TABLE |
+------------+--------------+_

次のコマンドを実行すると、カタログビューを見つけることができます。

_SELECT * 
FROM sys.all_views
WHERE [schema_id] = 4 AND [name] NOT LIKE 'dm%' AND [object_id] NOT IN (-212,-211,-210,-209,-208,-207,-206,-205,-204,-203,-202,-201,-200,-199,-198,-197,-196,-195,-194,-193,-192,-143,-142,-141,-140,-139,-138,-137,-136,-135,-134,-133,-132,-131,-130,-129,-106,-105)
ORDER BY [name] ASC_

そして Microsoft docs here

他のシステムテーブルをチェックアウトして、次のように比較できます。

  • _sys.databases_(SQL Server 2005以降)
  • _sys.sysdatabases_(SQL Server 2000)

マイクロソフトは、古いシステムテーブルの使用を推奨していません。古い互換性ビューには、SQL Serverの機能の上位バージョン(パーティション化など)に関連する新しいメタデータがありません。 MicrosoftはSQL Serverの将来のリリースから削除するため、SQL Server 2000でのみ使用してください。

4
user37701