SQL:用sysobjects代替sysobjects代码

问题描述:

我一直在玩一些涉及元数据的查询(希望我正在使用正确的术语),我做的一件事是返回所有表由当前用户创建,使用数据库。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

使用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