我想追踪用户创建情况。我查看了很多帖子中的DDL触发器,但这些似乎只能追踪对象,而不是用户。在SQL Server中是否有一种方法可以跟踪/记录用户何时被创建或删除?
我想追踪用户创建情况。我查看了很多帖子中的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
然而,如果你只是想在事后审计这些数据,你也可以从默认跟踪中获取这些信息,只要你足够频繁地轮询即可。
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 表示撤销访问权限。耸肩