确定哪些用户在 SQL Server 中创建了对象

问题描述 投票:0回答:6

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

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

sql sql-server-2005 t-sql
6个回答
60
投票

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

enter image description here

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


33
投票

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

虽然其中有一些内容可能表明谁创建了给定对象,但它们背后有很多“如果”。快速(不一定完整)回顾:

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

但是。

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

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

您可以查看这些数据(select * from sys.objects),但如果principal_id为空,您可能不走运。


19
投票

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

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

1
投票

如果您需要小型且特定的机制,可以搜索DLL Triggers信息。


0
投票

您可以使用下面的源代码示例来提取此信息。您只需注意,如果丢失跟踪文件,则无法获得最新信息,但最好通过日常工作定期在数据库中维护此源代码的输出,并且您的基础应该是此表。

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

0
投票

查询 sys.objects 可以为您提供 SQL Server 中所有用户创建的对象。

查询 sys.sysobjects 可以为您提供所有系统创建的对象。

因此,如果您想查看所有用户创建的对象,请查询此视图

从 sys.objects 中选择 *

如果你想查看所有用户创建的表和用户创建的过程,分别查询sys.tables和sys.procedures

从系统表中选择* 从 sys.procedures 中选择 *

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.