确定SQL Server中创建哪些用户对象(Determine what user created

2019-06-18 06:41发布

我想经过我们的发展数据库,现在和清理一些老的测试特效/表。 是否有可能确定创建哪些用户对象在SQL Server 2005数据库? 如果是的话,我将如何去寻找这些信息?

编辑:只是想澄清,问题的对象已经存在。 建立审计和可能触发不会做我多好。 我想我主要是寻找一种方式来使用系统表/视图来获取信息。

Answer 1:

答案是“没有,你可能无法”。

虽然有东西在那里,可以说谁创造了一个给定的对象,有很多“如果”他们身后的。 快速(不一定完整)的评论:

sys.objects中(并且因此SYS.TABLES,sys.procedures,sys.views等)具有列principal_id。 此值是涉及到数据库用户,这反过来又可以用SQL(实例)的登录名单中加入列表的外键。 (所有这些信息都可以在进一步的系统视图中找到。)

但。

在这里我们设置和BOL的粗略审查快速检查表明,该值仅设置(即不空),如果它是“从架构所有者不同”。 在我们的开发系统,我们已经有了DBO +其他两种模式,一切都出来作为NULL。 这可能是因为每个人都有这些数据库中的DBO权限。

这是使用NT验证。 SQL身份验证可能的工作原理大致相同。 此外,每个人都拥有并使用一个唯一的登录,或者他们共享? 如果有员工离职和域名(或SQL)登录掉下来,再一次数据可能不存在或可能不完整。

你可以看一下在这个数据(请从sys.objects中*),但如果principal_id为空,你很可能出于运气。



Answer 2:

如果对象是最近创建的,您可以检查架构更改历史记录报告中,SQL Server Management Studio中,它“提供了默认的跟踪记录数据库中的所有承诺DDL语句执行的历史”中:

然后,您可以搜索对象的创建语句。 其中显示的所有信息,还有谁执行DDL语句的登录名。



Answer 3:

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

select 
    so.name, su.name, so.crdate 
from 
    sysobjects so 
join 
    sysusers su on so.uid = su.uid  
order by 
    so.crdate


Answer 4:

如果你需要一个小的和具体的机制,你可以搜索DLL触发器信息。



Answer 5:

您是否尝试过这个查询:

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName,
last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( '<db name>')
AND OBJECT_ID=OBJECT_ID('<table name>')


文章来源: Determine what user created objects in SQL Server