SQL:使用sys.objects

时间:2016-11-29 11:27:10

标签: sql sql-server

我一直在玩一些涉及元数据的查询(希望我使用正确的术语),我做的一件事就是返回当前用户创建的所有表格,使用数据库中。

这是剧本:

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 个答案:

答案 0 :(得分:2)

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

  

principal_id - 个人所有者的ID,如果不同于   架构所有者。默认情况下,包含模式的对象归属于   架构所有者。但是,可以使用指定备用所有者   更改所有权的ALTER AUTHORIZATION语句。

来源:sys.objects documentation

尝试此查询:

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