SQL Server 跟踪 DDL CREATE USER

4

我想追踪用户创建情况。我查看了很多帖子中的DDL触发器,但这些似乎只能追踪对象,而不是用户。在SQL Server中是否有一种方法可以跟踪/记录用户何时被创建或删除?

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 表示删除,3 表示授予访问权限,4 表示撤销访问权限。耸肩

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接