首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:将sysobjects代码替换为sys.objects代码

SQL:将sysobjects代码替换为sys.objects代码
EN

Stack Overflow用户
提问于 2016-11-29 11:27:10
回答 1查看 841关注 0票数 1

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

这是一个脚本:

代码语言:javascript
复制
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只是为了与Server 2000向后兼容,所以必须使用sys.objects。我试图更改代码,但是sys.objects没有包含创建列表对象的用户的相关信息的列(sysobjects有列uid)。

如何用sys.objects代替上面提到的sys.objects

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-29 12:14:15

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

如果与架构所有者不同,则单个所有者的principal_id - ID。默认情况下,架构包含的对象由架构所有者拥有.但是,可以通过使用ALTER授权语句来更改所有权来指定备用所有者。

资料来源:sys.objects 文档.

请尝试以下查询:

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40864764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档