1

我的服务器上有一个以下 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

但引发的错误没有变化。

编辑2

我更改触发器并添加With Execute AS 'sa'触发器

但引发的错误没有变化。

4

2 回答 2

0

尝试向您的触发器添加适当的EXECUTE AS子句- 默认为, 因此除非用户有权插入您的审计表1,否则触发器将失败。CALLER

另外,然后ORIGINAL_LOGIN()在触发器中使用以获取正确的登录信息

1您通常不想要的 - 因为否则每个用户都可以伪造条目,声称其他用户已登录。

于 2013-10-28T13:41:17.350 回答
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;
于 2013-11-06T12:11:54.663 回答