この質問では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
Microsoftを起動するには、このディスカッションに関連する3つのカテゴリがあります。
SYSTEM TABLE
_、またはカタログテーブル「システムオブジェクト」を格納します。これらには、直接アクセスのためにDACが必要です。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)
です(まだ影響は不明です)type
、userstat
、およびsystat
はすべてここに追加されており、互換表示がcategory
と呼ぶものは非常に奇妙で、おそらく他の場所では使用されていません。 xtype
は_sys.sysschobjs$
_の純粋なタイプですsch
のsysschobjs
はスキーマを表すと思います。これはもう1つのアンチニーモニックです。sys
スキーマにないものを格納するため、忘れてください。そのためには_sys.system_objects
_が必要です。
以前の投稿で述べたように、sys.sysobjects
は非推奨です。
注sys.sysobjects(Transact-SQL) から取得
このSQL Server 2000システムテーブルは、下位互換性のためのビューとして含まれています。代わりに、現在のSQL Serverシステムビューを使用することをお勧めします。同等のシステムビューを見つけるには、 システムテーブルのシステムビューへのマッピング(Transact-SQL) を参照してください。この機能は、Microsoft SQL Serverの将来のバージョンで削除される予定です。新しい開発作業ではこの機能の使用を避け、この機能を現在使用しているアプリケーションの変更を計画してください。
sys.system_objects
とsys.objects
を組み合わせて、廃止されたsys.sysobjects
システムテーブルに格納されているすべてのアイテムを取得する必要があります。
SELECT * FROM sys.system_objects
UNION ALL
SELECT * FROM sys.objects AS o
結果:
(2171 row(s) affected)
Microsoft SQL Serverに含まれているすべてのスキーマスコープのシステムオブジェクトの1行が含まれます。すべてのシステムオブジェクトは、
sys
またはINFORMATION_SCHEMA
という名前のスキーマに含まれています。
ネイティブにコンパイルされたスカラーのユーザー定義関数を含む、データベース内で作成された各ユーザー定義のスキーマスコープオブジェクトの行が含まれます
たとえば、sp_MScleanupmergepublisher
はìs_ms_shipped
ですが、sys
schema(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
ここに違いがあります:
_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'
_
_+------------+--------------+
| 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
_
他のシステムテーブルをチェックアウトして、次のように比較できます。
sys.databases
_(SQL Server 2005以降)sys.sysdatabases
_(SQL Server 2000)マイクロソフトは、古いシステムテーブルの使用を推奨していません。古い互換性ビューには、SQL Serverの機能の上位バージョン(パーティション化など)に関連する新しいメタデータがありません。 MicrosoftはSQL Serverの将来のリリースから削除するため、SQL Server 2000でのみ使用してください。