【问题标题】:SQL Server track DDL CREATE USERSQL Server 跟踪 DDL 创建用户
【发布时间】:2013-10-22 19:32:26
【问题描述】:

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

【问题讨论】:

    标签: sql-server triggers ddl ddl-trigger


    【解决方案1】:

    CREATE_USER is absolutely a trackable DDL eventDROP_USER 和 SQL Server 2005 以来都是如此。BOL is hard-pressed for decent examples, though。事实上,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 中判断它是哪个事件,但我的经验与 the documentation 不匹配 - 我得到 3 表示添加,4 表示删除,但他们说 1 是 Add,2 是 Drop,3 是授予访问权限,4 是撤销访问权限。 耸耸肩

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多