【发布时间】:2009-08-10 16:45:20
【问题描述】:
我现在正在尝试检查我们的开发数据库并清理一些旧的测试过程/表。是否可以确定用户在 SQL Server 2005 数据库中创建的对象?如果是这样,我将如何查找这些信息?
编辑:只是想澄清有问题的对象已经存在。设置审计和触发器可能对我没有多大好处。我想我主要是在寻找一种使用系统表/视图来获取信息的方法。
【问题讨论】:
标签: sql sql-server-2005 tsql
我现在正在尝试检查我们的开发数据库并清理一些旧的测试过程/表。是否可以确定用户在 SQL Server 2005 数据库中创建的对象?如果是这样,我将如何查找这些信息?
编辑:只是想澄清有问题的对象已经存在。设置审计和触发器可能对我没有多大好处。我想我主要是在寻找一种使用系统表/视图来获取信息的方法。
【问题讨论】:
标签: sql sql-server-2005 tsql
如果对象是最近创建的,您可以在 SQL Server Management Studio 中查看“架构更改历史记录”报告,该报告“提供了默认跟踪记录的数据库中所有已提交 DDL 语句执行的历史记录”:
然后您可以搜索对象的创建语句。在显示的所有信息中,有执行DDL语句的登录名。
【讨论】:
答案是“不,你可能不能”。
虽然其中有些东西可能会说明谁创建了给定对象,但它们背后有很多“如果”。快速(不一定是完整的)审查:
sys.objects(因此 sys.tables、sys.procedures、sys.views 等)具有列 principal_id。该值是与数据库用户列表相关的外键,而该列表又可以与 SQL(实例)登录列表连接。 (所有这些信息都可以在进一步的系统视图中找到。)
但是。
在此处快速检查我们的设置并粗略查看 BOL 表明该值仅在“与架构所有者不同”时才设置(即不为空)。在我们的开发系统中,我们有 dbo + 其他两个模式,所有内容都显示为 NULL。这可能是因为每个人都在这些数据库中拥有 dbo 权限。
这是使用 NT 身份验证。 SQL 身份验证的工作方式可能大致相同。另外,每个人都有并使用唯一的登录名,还是共享的?如果您有员工流动率并且域(或 SQL)登录被丢弃,那么数据可能不存在或可能不完整。
您可以查看此数据(从 sys.objects 中选择 *),但如果 principal_id 为空,您可能不走运。
【讨论】:
如果每个用户都有自己的 SQL Server 登录名,您可以试试这个
select
so.name, su.name, so.crdate
from
sysobjects so
join
sysusers su on so.uid = su.uid
order by
so.crdate
【讨论】:
如果需要小而具体的机制,可以搜索DLL Triggersinfo。
【讨论】: