Sql server SQL Server跟踪DDL创建用户

Sql server SQL Server跟踪DDL创建用户,sql-server,triggers,ddl,ddl-trigger,Sql Server,Triggers,Ddl,Ddl Trigger,我正在尝试跟踪用户创建。我在很多文章中都看过DDL触发器,但它们似乎只跟踪对象,而不是用户。我是否可以跟踪/记录在SQL Server中创建或删除用户的时间?,就像在SQL Server 2005中创建或删除用户一样。事实上,DDL触发器eventdata模式不够灵活,无法始终按照您想要的方式命名实体(如UserName)。这不是直观的,可能是造成混淆的原因,但实际上需要从ObjectName中提取所创建用户的名称: USE [your_database_name]; GO CREATE TR

我正在尝试跟踪用户创建。我在很多文章中都看过DDL触发器,但它们似乎只跟踪对象,而不是用户。我是否可以跟踪/记录在SQL Server中创建或删除用户的时间?

,就像在SQL Server 2005中创建或删除用户一样。事实上,DDL触发器eventdata模式不够灵活,无法始终按照您想要的方式命名实体(如
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是撤销访问。耸耸肩