SQl Server触发器可以';不要改变

SQl Server触发器可以';不要改变,sql,sql-server,triggers,Sql,Sql Server,Triggers,为了防止使用CHECK\u POLICY=OFF创建\更改SQL登录,我创建了一个服务器触发器: GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [create_or_alter_login] ON ALL SERVER FOR CREATE_LOGIN, ALTER_LOGIN as begin DECLARE @data xml DECLARE @text nvarchar(max);

为了防止使用CHECK\u POLICY=OFF创建\更改SQL登录,我创建了一个服务器触发器:

GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [create_or_alter_login] ON ALL SERVER
FOR CREATE_LOGIN, ALTER_LOGIN
as
begin
    DECLARE @data xml
    DECLARE @text nvarchar(max);
    DECLARE @user nvarchar(max);
    DECLARE @object_name nvarchar(max);
    DECLARE @MESSAGE_LOG varchar(255);
    DECLARE @MESSAGE_PRINT varchar(255);
    
    SET @data = EVENTDATA();
    SET @text = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)');
    SET @user = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(max)');
    SET @object_name = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(max)');
    IF(@text LIKE N'%CHECK_POLICY=OFF%')
    BEGIN
        SET @MESSAGE_LOG = 'XXX Policy: CHECK_POLICY=OFF is a forbidden setting. Rollback for a batch ' + @text 
        exec xp_logevent 60000, @MESSAGE_LOG , warning
        SET @MESSAGE_PRINT  = '
        ************************************************************
        ' + 'XXX Policy: CHECK_POLICY=OFF is a forbidden setting.
        ' + 'Rollback SQL login change for '+ @object_name + '
        ************************************************************
        '
        Rollback
        RAISERROR (@MESSAGE_PRINT,10,1)
        
    END
    ELSE
    BEGIN
        SET @MESSAGE_LOG = 'SQL Login has been created or changed: ' + @text
        exec xp_logevent 60000, @MESSAGE_LOG , informational
    END

end 
如果我使用t-sql或SSMS,它可以正常工作,但是如果使用dbatools commandlet来复制或创建登录,那么仍然可以创建登录。 这是一个触发代码问题和我的错误,还是SQL powershell模块使用非事务性创建数据库对象?有什么方法可以捕获并回滚它吗


谢谢大家!

dbatools Commandlets发布了什么T-SQL?它在什么安全上下文下运行?我在测试系统上以具有sa permissons的active directory用户身份运行它。不幸的是,即使在多次探查器跟踪之后,我也没有看到确切的t-sql语句(“出于安全原因被替换,表示探查器”),只有一条关于它的事件消息,这是一个标准的t-sql:
CREATE LOGIN[XXXX],密码=0x*************散列,SID=XXXXX,默认的_数据库=[master],默认的_语言=[us_english],CHECK_EXPIRATION=OFF,CHECK_POLICY=OFF
我可以猜到两件事:1.触发器首先被禁用;2.它正在使用DAC。这些看起来有些过头了,您应该在SQL Server日志中看到它的一些迹象。事实上,我建议快速查看一下。谢谢您的快速回复!触发器处于活动状态,我可以在SQL和事件日志中看到消息由于windows服务器上有防火墙,并且DAC端口未打开,我不确定这是否可能。我猜powershell使用的SMO正在运行某种“无事务”更改,但我没有关于它的任何其他信息。