2016-11-29 2 views
0

私は、メタデータを含むいくつかのクエリを使用して遊んできましたが(うまくいけば、私は正しい用語を使用している)、すべてのテーブルを返すことでしたデータベースを使用して、現在のユーザーによって作成されます。SQL:sysobjectsでコードをsys.objectsで置き換える

これはスクリプトです:

SELECT so.name as [Table], su.name as [User] 
FROM sysobjects so 
INNER JOIN sysusers su 
ON so.uid = su.uid 
WHERE xtype = 'U' -- user-defined table 
AND su.name=USER_NAME() 

その後、私はsysobjectsが唯一のSQL Server 2000との下位互換性を維持するためのシステムであり、もう1つは代わりにsys.objectsを使用する必要があることを読みました。さて、コードを変更しようとしましたが、sys.objectsには、リストされたオブジェクトを作成したユーザー(sysobjectsの列にはuid)に関する情報の列がありません。

sysobjectsを上記のsys.objectsに置き換えるにはどうすればよいですか?

答えて

1

sys.objectsテーブルを使用してください。個々の所有者のID、 スキーマ所有者異なる場合 -

principal_idprincipal_id列には、必要な値が含まれています。デフォルトでは、スキーマに含まれるオブジェクトは スキーマ所有者が所有します。ただし、所有者を変更するには、 ALTER AUTHORIZATIONステートメントを使用して代替所有者を指定することができます。

出典:sys.objectsdocumentation。私は `NULL`を得るTable_Owner_User_Id`列`で

SELECT t.name AS Table_Name 
     ,t.principal_id AS Table_Owner_User_Id 
     ,s.schema_id 
     ,s.name AS Schema_Name 
     ,s.principal_id AS Schema_Owner_User_Id 
FROM sys.objects t 
    INNER JOIN sys.schemas s 
     ON t.schema_id = s.schema_id 
WHERE t.type = 'U' 
AND COALESCE(t.principal_id, s.principal_id) = USER_ID() 
-- Or, if you must use USER_NAME(), then use the following instead: 
--AND USER_NAME(COALESCE(t.principal_id, s.principal_id)) = USER_NAME() 
+0

は、この文字列で検索してください。ドキュメントによると、テーブルを取得しているだけなので、これは特定の所有者がいないことを意味します(所有権はデフォルトで 'dbo'に行きました)。ありがとう!! – Jazz

+1

修正します。そのため、 'COALESCE()'関数を使ってテーブルの 'principal_id'を返します。もし見つからなければ、スキーマの' principal_id'を返します。 – Serge

関連する問題