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

Posted

技术标签:

【中文标题】确定用户在 SQL Server 中创建的对象【英文标题】:Determine what user created objects in SQL Server 【发布时间】:2009-08-10 16:45:20 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

答案是“不,你可能不能”。

虽然其中有些东西可能会说明谁创建了给定对象,但它们背后有很多“如果”。快速(不一定是完整的)审查:

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

但是。

在此处快速检查我们的设置并粗略查看 BOL 表明该值仅在“与架构所有者不同”时才设置(即不为空)。在我们的开发系统中,我们有 dbo + 其他两个模式,所有内容都显示为 NULL。这可能是因为每个人都在这些数据库中拥有 dbo 权限。

这是使用 NT 身份验证。 SQL 身份验证的工作方式可能大致相同。另外,每个人都有并使用唯一的登录名,还是共享的?如果您有员工流动率并且域(或 SQL)登录被丢弃,那么数据可能不存在或可能不完整。

您可以查看此数据(从 sys.objects 中选择 *),但如果 principal_id 为空,您可能不走运。

【讨论】:

【参考方案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

【讨论】:

但看起来so.uid确实是非导入dbs的SchemaId:msdn.microsoft.com/en-us/library/ms177596.aspx 对我来说,它给了我角色名称而不是实际用户。 @Guillermo Gutiérrez 的报告给出了实际的用户名。【参考方案4】:

如果需要小而具体的机制,可以搜索DLL Triggersinfo。

【讨论】:

以上是关于确定用户在 SQL Server 中创建的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2012 中创建的临时表上查找索引列表

iOS:如何保存在应用程序中创建的自定义对象

如何在颤动的另一个有状态小部件中访问在一个有状态小部件中创建的对象

使用在另一个 Swift VC 文件中创建的对象?

怎么在 sql server 2008中创建登录名

SQL Server统计信息简介