SQl Server触发器可以';不要改变
为了防止使用CHECK\u POLICY=OFF创建\更改SQL登录,我创建了一个服务器触发器: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);
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正在运行某种“无事务”更改,但我没有关于它的任何其他信息。