我现在正在尝试检查我们的开发数据库并清理一些旧的测试过程/表。是否可以确定哪些用户在 SQL Server 2005 数据库中创建了对象?如果是这样,我将如何找到该信息?
编辑:只是想澄清有问题的对象已经存在。设置审核和触发器可能不会给我带来多大好处。我想我主要是在寻找一种使用系统表/视图来获取信息的方法。
如果该对象是最近创建的,您可以在 SQL Server Management Studio 中检查架构更改历史记录报告,该报告“提供由默认跟踪记录的数据库内所有已提交 DDL 语句执行的历史记录”:
然后您可以搜索对象的创建语句。显示的所有信息中,有执行DDL语句的登录名。
答案是“不,你可能不能”。
虽然其中有一些内容可能表明谁创建了给定对象,但它们背后有很多“如果”。快速(不一定完整)回顾:
sys.objects(以及sys.tables、sys.procedures、sys.views等)具有principal_id列。该值是与数据库用户列表相关的外键,该列表又可以与 SQL(实例)登录列表相连接。 (所有这些信息都可以在进一步的系统视图中找到。)
但是。
快速检查一下我们在这里的设置并粗略地回顾一下 BOL 表明,只有当该值“与模式所有者不同”时,该值才会被设置(即不为空)。在我们的开发系统中,我们有 dbo + 两个其他模式,所有内容都显示为 NULL。这可能是因为每个人都在这些数据库中拥有 dbo 权限。
这是使用 NT 身份验证。 SQL 身份验证的工作原理可能大致相同。另外,每个人都拥有 并使用 唯一的登录名,还是共享的?如果您有员工流动并且域(或 SQL)登录被删除,那么数据可能再次不存在或可能不完整。
您可以查看这些数据(select * from 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 Triggers信息。
您可以使用下面的源代码示例来提取此信息。您只需注意,如果丢失跟踪文件,则无法获得最新信息,但最好通过日常工作定期在数据库中维护此源代码的输出,并且您的基础应该是此表。
DECLARE @curr_tracefilename VARCHAR(500);
DECLARE @indx int ;
DECLARE @base_tracefilename VARCHAR(500);
DECLARE @path_separator CHAR(1) ;
SET @path_separator = ISNULL(CONVERT(CHAR(1), SERVERPROPERTY('PathSeparator')), '\') ;
SELECT @curr_tracefilename = path FROM sys.traces WHERE is_default = 1 ;
SET @curr_tracefilename = reverse(@curr_tracefilename)
SELECT @indx = PATINDEX('%'+@path_separator+'%', @curr_tracefilename)
SET @curr_tracefilename = REVERSE(@curr_tracefilename)
SET @base_tracefilename = LEFT( @curr_tracefilename,LEN(@curr_tracefilename) - @indx) + @path_separator + 'log.trc';
--insert into @temp_trace
SELECT ObjectName
, DatabaseName
, StartTime
, CASE EventClass WHEN 46 THEN 'CREATE' WHEN 47 THEN 'DROP' WHEN 164 THEN 'ALTER' END AS EventClass
, EventSubClass
, ObjectType
, ServerName
, LoginName
, ApplicationName
, 'temp'
FROM ::fn_trace_gettable( @base_tracefilename, DEFAULT )
WHERE
EventSubclass = 0
AND DB_NAME(DatabaseID) NOT IN ('tempdb','msdb','master')
AND EventClass in (46,47,164)
AND ObjectName is not NULL
查询 sys.objects 可以为您提供 SQL Server 中所有用户创建的对象。
查询 sys.sysobjects 可以为您提供所有系统创建的对象。
因此,如果您想查看所有用户创建的对象,请查询此视图
从 sys.objects 中选择 *
如果你想查看所有用户创建的表和用户创建的过程,分别查询sys.tables和sys.procedures
从系统表中选择* 从 sys.procedures 中选择 *