我正在尝试跟踪用户创建。我在许多帖子中查看过 DDL 触发器,但这些触发器似乎只跟踪对象,而不跟踪用户。有没有办法让我跟踪/记录 SQL Server 中创建或删除用户的时间?
最佳答案
CREATE_USER
is absolutely a trackable DDL event ,DROP_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/