确定用户在SQL Server中创建的对象

bca*_*asp 45 sql t-sql sql-server-2005

我正在尝试通过我们的开发数据库,​​并清理一些旧的测试过程/表.是否可以确定用户在SQL Server 2005数据库中创建了哪些对象?如果是这样,我将如何找到这些信息?

编辑:只是想澄清有问题的对象已经存在.设置审计和触发器可能对我没什么好处.我想我主要是在寻找一种方法来使用系统表/视图来获取信息.

Gui*_*rez 45

如果最近创建了该对象,则可以在SQL Server Management Studio中检查"架构更改历史记录"报告,该报告"提供默认跟踪记录的数据库中所有已提交的DDL语句执行的历史记录":

在此输入图像描述

然后,您可以搜索对象的create语句.在显示的所有信息中,有登录名执行DDL语句.


Phi*_*ley 29

答案是"不,你可能不会".

虽然那里有东西可能会说谁创造了一个给定的对象,但它们背后有很多"ifs".快速(并不一定完整)评论:

sys.objects(以及sys.tables,sys.procedures,sys.views等)具有列principal_id.此值是与数据库用户列表相关的外键,而后者又可以与SQL(实例)登录列表连接.(所有这些信息都可以在其他系统视图中找到.)

但.

在这里我们设置和BOL的粗略审查快速检查表明,该值仅设置(即不空),如果它是"从架构所有者不同".在我们的开发系统中,我们有dbo +两个其他模式,所有内容都是NULL.这可能是因为每个人都拥有这些数据库中的dbo权限.

这是使用NT身份验证.SQL身份验证可能大致相同.此外,每个人都拥有并使用唯一的登录信息,还是共享?如果您有员工流失并且域(或SQL)登录被删除,则数据可能不再存在或可能不完整.

您可以查看此数据(select*from sys.objects),但如果principal_id为null,则可能运气不佳.


Cru*_*lIO 19

如果每个用户都有自己的SQL Server登录,您可以尝试这样做

select 
    so.name, su.name, so.crdate 
from 
    sysobjects so 
join 
    sysusers su on so.uid = su.uid  
order by 
    so.crdate
Run Code Online (Sandbox Code Playgroud)

  • 但看起来 so.uid 实际上是非导入数据库的 SchemaId:http://msdn.microsoft.com/en-us/library/ms177596.aspx (3认同)