如何在SQL Server中阻止删除数据库触发器 即便服务器所有者也无法操作
SQL Server本地部署场景下防止触发器被删除的实现方案
首先明确前提:只要用户拥有SQL Server实例的sysadmin(服务器所有者)权限,不存在绝对无法被删除的数据库对象,但可以通过多层防护大幅提升篡改门槛,足以阻止绝大多数懂基础SQL的普通用户操作,甚至非专业DBA都需要付出极高成本才能破解:
服务器级DDL触发器拦截
创建服务器级别的DDL触发器,专门拦截针对你业务触发器的删除、修改操作,仅允许你的Winform程序发起这类操作,示例代码如下:
完成创建后关闭服务器高级选项展示,避免普通用户直接查看该触发器的逻辑:CREATE TRIGGER Prevent_Delete_Biz_Triggers ON ALL SERVER FOR DROP_TRIGGER, ALTER_TRIGGER AS BEGIN DECLARE @EventData XML = EVENTDATA() -- 匹配你的业务数据库和保护触发器名称 IF @EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname') = N'你的业务库名' AND @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname') IN (N'触发器1', N'触发器2') BEGIN -- 校验当前会话是否来自你的Winform程序,可替换为自定义密钥校验逻辑 IF NOT EXISTS ( SELECT 1 FROM sys.dm_exec_sessions WHERE session_id = @@SPID AND program_name = N'你程序的唯一标识字符串' ) BEGIN RAISERROR('无权操作受保护的业务触发器', 16, 1) ROLLBACK TRANSACTION END END ENDsp_configure 'show advanced options', 0 RECONFIGURE触发器定义加密
创建业务触发器时添加WITH ENCRYPTION参数,SQL Server会对触发器的定义文本做不可逆加密,普通用户无法查看触发器逻辑,也无法快速找到绕过防护的入口:CREATE TRIGGER Biz_Trigger_Protect ON 你的业务表名 WITH ENCRYPTION FOR INSERT,UPDATE,DELETE AS BEGIN -- 你的防篡改逻辑 END权限隔离防护
客户端安装程序时默认给普通用户分配仅db_datareader、db_datawriter的数据库权限,sysadmin级别的账号密码随机生成后加密存储在本地,仅你的Winform程序需要执行DDL操作时才会解密调用,普通用户根本无法获取sysadmin权限的登录凭证。
额外补充:以上方案仅能提升防护门槛,无法100%防御持有物理机最高权限的技术人员破解,你可以额外在业务层做数据哈希校验,每次读取数据时校验完整性,一旦检测到篡改直接锁定程序使用,进一步降低数据被篡改的风险。
内容的提问来源于stack exchange,提问作者Anass Hadeg
相关产品推荐
相关产品推荐

