4

我正在尝试跟踪用户的创建。我在许多帖子中查看了 DDL 触发器,但这些触发器似乎只跟踪对象,而不是用户。在 SQL Server 中创建或删除用户时,我是否可以跟踪/记录?

4

1 回答 1

6

CREATE_USER绝对是一个可跟踪的 DDL 事件DROP_USER并且两者都是自 SQL Server 2005 以来的。不过,BOL 很难找到像样的示例。事实上,DDL 触发器事件数据模式不够灵活,无法始终以您想要的方式命名实体(如UserName)。这不直观,可能是您困惑的根源,但您实际上需要从以下位置提取创建用户的名称ObjectName

USE [your_database_name];
GO

CREATE TRIGGER CatchUser
ON DATABASE
FOR CREATE_USER, DROP_USER
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @x XML = EVENTDATA();

  -- INSERT dbo.LoggingTable(Columns)
  SELECT 
    EventType = @x.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(256)'),
    UserName  = @x.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(256)'),
    LoginName = @x.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(512)'),
    StartTime = @x.value('(/EVENT_INSTANCE/PostTime)[1]',  'datetime');
END

但是,如果您只是在事后尝试审核此数据,如果您轮询足够频繁,您也可以从默认跟踪中提取此信息。

DECLARE @path NVARCHAR(260);

SELECT @path = REVERSE(SUBSTRING(REVERSE([path]), 
   CHARINDEX(CHAR(92), REVERSE([path])), 260)) + N'log.trc'
FROM sys.traces WHERE is_default = 1;

SELECT EventType = CASE EventSubClass WHEN 3 THEN 'CREATE_USER'
  WHEN 4 THEN 'DROP_USER' END, TargetUserName, LoginName, StartTime
FROM sys.fn_trace_gettable(@path, DEFAULT)
WHERE EventClass = 109 -- Create DB User Event
AND DatabaseName = N'your_database_name'
ORDER BY StartTime DESC;

这将得到添加和删除,您应该能够从哪个事件中判断它是哪个事件,但我的经验与文档EventSubClass不匹配- 我得到 3 代表添加,4 代表删除,但他们说 1 是添加, 2 是 Drop,3 是授予访问权限,4 是撤销访问权限。耸耸肩

于 2013-10-22T20:20:50.533 回答