2013-10-22 1 views
4

사용자 만들기를 추적하려고합니다. 많은 게시물에서 DDL 트리거를 살펴 봤지만 사용자가 아닌 개체를 추적하는 것만 보입니다. SQL Server에서 사용자를 만들거나 삭제할 때 추적/기록 할 수있는 방법이 있습니까?SQL Server 트랙 DDL 만들기 사용자

답변

6

CREATE_USER is absolutely a trackable DDL eventDROP_USER이고, 둘 다 SQL Server 2005 이후였습니다. BOL is hard-pressed for decent examples, though. 진실은 DDL 트리거 eventdata 스키마가 항상 원하는 방식으로 명명 된 엔티티 (예 : 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이 grant access이고, 4가 revoke access라고합니다. 어깨동구

관련 문제