1

我有以下DDL觸發器我的服務器上DDL觸發器的登錄插入數據表

CREATE TRIGGER [DDLForLogin] ON ALL SERVER 
FOR LOGON 
AS BEGIN 
    DECLARE @data XML 
    SET @data = EVENTDATA() 

    IF EXISTS(SELECT * FROM sys.Databases WHERE NAME = 'DatabaseMaintenance') Begin 
     INSERT INTO DatabaseMaintenance.dbo.MyTable (UserName, HostName, ApplicationName, EventDataValue) 
     VALUES (CURRENT_USER, HOST_Name(), APP_NAME(),@Data) 
    END 
END; 

登錄爲Windows Authentication插入mytable上一個行,但登錄爲SQL Server Authentication以下錯誤提出:

Logon failed for login 'xxx' due to trigger execution. 
Changed database context to 'master'. 
Changed language setting to us_english. (Microsofr SQL Server, Error: 17892) 

編輯

GRANT INSERT我的表PUBLIC

但沒有更改提出的錯誤。

EDIT2

我改變我的觸發和觸發

但引發的錯誤沒有變化添加With Execute AS 'sa'

回答

0

必須將觸發器更改爲以下代碼:

CREATE TRIGGER [DDLForLogin] ON ALL SERVER 
WITH EXECUTE AS 'sa' 
FOR LOGON 
AS BEGIN 
    DECLARE @data XML 
    SET @data = EVENTDATA() 

    DECLARE @IsPooled int 
    SET @IsPooled = @data.value('(/EVENT_INSTANCE/IsPooled)[1]', 'int') 

    IF EXISTS(SELECT * FROM sys.Databases WHERE NAME = 'DatabaseMaintenance')AND (@IsPooled=0) Begin 
     insert into DatabaseMaintenance.dbo.Login (UserName, HostName, ApplicationName, EventDataValue) 
     values (ORIGINAL_LOGIN(), HOST_Name(), APP_NAME(),@Data) 
    END 
END; 
0

嘗試加入適當的EXECUTE AS條款您trigger - 默認爲CALLER,所以除非用戶有權插入到審計表,觸發將失敗。

此外,然後使用ORIGINAL_LOGIN()在觸發以獲得正確的登錄信息

,你通常不希望 - 因爲如果每個用戶都可以僞造項指控其他用戶登錄