Kri*_*rgi 4 sql-server ddl triggers ddl-trigger
我正在尝试跟踪用户创建.我在许多帖子中查看了DDL触发器,但这些似乎只是跟踪对象,而不是用户.有没有办法跟踪/记录在SQL Server中创建或删除用户的时间?
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
Run Code Online (Sandbox Code Playgroud)
但是,如果您只是尝试在事后审核此数据,则还可以从默认跟踪中提取此信息(如果您经常轮询).
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;
Run Code Online (Sandbox Code Playgroud)
这将得到添加和删除,你应该能够告诉EventSubClass它是哪个事件,但我的经验与文档不匹配- 我得到3为Add,4为Drop,但他们说1是添加,2是Drop,3是授权访问,4是撤销访问.耸