簡體   English   中英

SQL:使用sysobjects將代碼替換為sys.objects的代碼

[英]SQL: Replacing code with sysobjects to one with 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向后兼容,而必須使用sys.objects代替。 好吧,我嘗試更改代碼,但是sys.objects沒有包含與創建所列出對象的用戶有關的信息的列( sysobjects具有列uid )。

如何用sys.objects替換上面的sysobjects

使用sys.objects表。 principal_id列包含所需的值:

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

資料來源: sys.objects 文檔

試試這個查詢:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM