web-dev-qa-db-ja.com

sys.objectsカタログビューはそれ自体からどのように取得しますか?

私は _OBJECT_DEFINITION_と呼ばれる)というストアドプロシージャを使用しています 。これは、SQL Serverシステムに頭を抱えるのに役立ちます。ただし、まだ理解できない領域が1つあります。この1つのテーブル_sys.objects_では、それ自体からプルされていることがわかります。

_1> SELECT OBJECT_DEFINITION(OBJECT_ID('sys.objects'))
2> GO

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE VIEW sys.objects AS
    SELECT name, 
      .. stuff.
    FROM sys.objects$
_

_sys.objects_から_sys.objects$_を選択する方法_sys.objects$_とは何ですか?そこで考えて同じ名前のテーブルである可能性があります最初に同じ名前でテーブルとビューを作成しようとしましたが、できませんそれ。取得します(fは選択した名前です)。これまでに使用したことのあるデータベースでは、これを行うことはできません。

_Msg 2714, Level 16, State 3, Server x230, Procedure f, Line 1
There is already an object named 'f' in the database.
_

Microsoft docs _sys.objects_カタログビューとしてのみ 、それは ベーステーブル としてリストされていません

対応するカタログビュー _sys.system_objects_はベーステーブルからプルします_sys.sysschobjs_ 、および_OBJECT_DEFINITION_はそれを明確に示しています。

私の推測では、ここのSQLは実際にビューが実行しているSQLではなく、ある種のコメントまたは説明:ソートのメタデータであり、バグが含まれています。しかし、私は完全にオフになる可能性があります。

2
Evan Carroll

sys.objectsはテーブルではなく、システムカタログビューです。質問に示されている定義は、Create VIEW ...も示しています。また、sys.objectssys.objects$と同じではありません。

  1. 通常の接続ではsys.objects$から選択できません。 DAC接続からSELECTへのアクセスは、必ずしもシングルユーザーモードである必要はありませんが、DAC接続上にある必要があります。
  2. 列の数が同じではありません。 DAC接続に接続し、以下を実行するだけです。

    SELECT TOP (1) * FROM sys.objects;
    GO
    SELECT TOP (1) * FROM sys.objects$;
    GO
    

sys.objects$の基礎となるフィールド(末尾にsys.objectsがない)は、sysschobjssyssingleobjrefssyspalnamesのテーブルから取得されるため、$は内部カタログビューである必要があります。

3
Solomon Rutzky