2016-11-29 73 views
0

我一直在玩一些涉及元數據的查詢(希望我正在使用正確的術語),我做的一件事是返回所有表由當前用戶創建,使用數據庫。SQL:用sysobjects代替sysobjects代碼

這是腳本:

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的向後兼容性,並且必須使用sys.objects代替。那麼,我試圖更改代碼,但是sys.objects沒有與用戶相關信息的列(sysobjects的列爲uid)創建了列出的對象。

如何將sysobjects替換爲sys.objects

回答

1

使用sys.objects表。該principal_id列包含您想要的值:

principal_id - ID個體老闆的,如果從 架構所有者不同。默認情況下,模式包含的對象由模式所有者擁有。但是,可以使用ALTER AUTHORIZATION語句使用 來指定備用所有者以更改所有權。

來源:sys.objectsdocumentation

嘗試此查詢:

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

在列'Table_Owner_User_Id'我只得到'NULL'。根據文檔,並考慮到我們只是檢索表,這意味着沒有特定的所有者(並且所有權默認情況下轉到'dbo')。謝謝!! – Jazz

+1

正確。這就是爲什麼我們使用'COALESCE()'函數返回表的'principal_id',或者如果缺少,則使用模式的'principal_id'。 – Serge