我可以检索特定用户拥有的所有数据库对象吗?


Answers:


22

这应该为您提供所需的东西:

;with objects_cte as
(
    select
        o.name,
        o.type_desc,
        case
            when o.principal_id is null then s.principal_id
            else o.principal_id
        end as principal_id
    from sys.objects o
    inner join sys.schemas s
    on o.schema_id = s.schema_id
    where o.is_ms_shipped = 0
    and o.type in ('U', 'FN', 'FS', 'FT', 'IF', 'P', 'PC', 'TA', 'TF', 'TR', 'V')
)
select
    cte.name,
    cte.type_desc,
    dp.name
from objects_cte cte
inner join sys.database_principals dp
on cte.principal_id = dp.principal_id
where dp.name = 'YourUser';

这将获得您的特定用户拥有的对象('YourUser'当然是替代品)。该查询提取的对象类型为:

  • FN = SQL标量函数
  • FS =装配(CLR)标量函数
  • FT =装配(CLR)表值函数
  • IF = SQL内联表值函数
  • P = SQL存储过程
  • PC =程序集(CLR)存储过程
  • TA =装配(CLR)DML触发器
  • TF = SQL表值函数
  • TR = SQL DML触发器
  • U =表(用户定义)
  • V =视图

1
(通过搜索找到。)其中不包括非模式范围的对象,例如Service Broker消息类型。您是否知道在不深入研究所有特定对象元数据视图的情况下获取该信息的简便方法?(此外,我不确定为什么要限制此查询中返回的对象的类型,因为它可能会排除某些感兴趣的对象。)
Jon Seigel 2013年

好吧,我最终创建了自己的视图。如果您知道更好的解决方案,请告诉我。
乔恩·塞格尔

@JonSeigel我已经在上面使用UNION编写了一个。您可以发表您的文章,以便我进行比较和改进吗?
PseudoToad 2015年

3

要显示所有非sa数据库所有者:

SELECT suser_sname( owner_sid ) OwnerID , * FROM sys.databases where suser_sname( owner_sid ) <> 'sa'

如果您需要SQL系统作业所有者:

select s.name,l.name  
from  msdb..sysjobs s 
left join master.sys.syslogins l on s.owner_sid = l.sid 
where l.name is not null and l.name <> 'sa'
order by l.name

1
问题询问每个数据库对象,而不仅仅是数据库本身。
SqlWorldWide

@SqlWorldWide-但可接受的答案不包括拥有的数据库,因此该答案还有帮助。(有趣的是,此处返回的“所有者”名称甚至不存在于已接受答案中引用的sys.database_principals表中。很想知道发生了什么。)
youcantryreachingme

2

对于Jobs,您不能使用syslogins,因为所有者可能是组的一部分,并且不存在于登录名中。使用以下

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.