sql-server - SQL Server跟踪DDL CREATE USER

标签 sql-server triggers ddl ddl-trigger

我正在尝试跟踪用户创建。我在许多帖子中查看过 DDL 触发器,但这些触发器似乎只跟踪对象,而不跟踪用户。有没有办法让我跟踪/记录 SQL Server 中创建或删除用户的时间?

最佳答案

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

关于sql-server - SQL Server跟踪DDL CREATE USER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19526695/

相关文章:

sql - 是否有为 SQL Server 生成完整数据库 DDL 的工具? Postgres 和 MySQL 呢?

sql - 如何通过生成 id SSIS 将表拆分为 Master/Detail?

sql-server - 为什么这个子查询不起作用? SQL Server初学者练习案例

sql-server - 在 Visual Studio 中运行 SQL 脚本

具有内连接的 MYSQL 触发器

postgresql - 如何删除未使用的序列?

sql - 将列类型从 timestamp WITHOUT time zone 更改为 timestamp WITH time zone

sql-server - 在数据库表中使用汇总列是否常见或良好的形式?

mysql - 使用 MySQL 触发器替换输入

mysql - 如何从 BEFORE UPDATE 触发器内的同一个表中检索计数