确定用户在 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 中创建的临时表上查找索引列表