sql - SQL Server 触发器无法回滚更改
问题描述
为了防止创建 \ 使用 CHECK_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 Commandlets 复制或创建登录名,它仍然可以创建登录名。这是触发代码问题和我的错误,还是 SQL powershell 模块使用数据库对象的非事务性创建?有什么方法可以捕获和回滚它?
谢谢!
解决方案
推荐阅读
- javascript - 将数据从路由器发送到前端js的方法
- javascript - 当对象在 React 中悬停时替换框中的文本
- android - 仅在 Kotlin 中使用 android 相机意图拍照,而不是视频
- reactjs - React 替换组件WillReceiveProps
- algorithm - 关于循环算法的进程和队列的理解问题
- java - 如何使用多个数据源进行故障转移 rdbms
- python - 使networkx情节看起来不错
- excel - 如何修复 Power BI 中类型更改的错误?
- html - CSS滚动阴影没有出现在背景颜色之上
- java - 如何在 switch 语句中使用字符串作为 case 标签