分享

SQL SERVER 利用触发器禁止删除数据并记录删除日志

 刮骨剑 2019-05-17

        有时候我们数据库表中的数据会莫名其妙的被删除,不知道是业务问题还是被黑了,所以我们想要在数据库操作层面对此进行制止,同时记录操作的日志,我们可以利用触发器来实现这个需求,测试数据:

  1. --测试数据
  2. if not object_id(N'T') is null
  3. drop table T
  4. Go
  5. Create table T([ID] int,[姓名] nvarchar(22))
  6. Insert T
  7. select 1,N'张三' union all
  8. select 2,N'李四' union all
  9. select 3,N'王五'
  10. GO
  11. --测试数据结束

        新建日志表:

  1. CREATE TABLE TBLOG
  2. (
  3. ID INT NOT NULL IDENTITY(1, 1) ,
  4. EVTIME DATETIME NOT NULL DEFAULT ( GETDATE() ) , --访问时间
  5. [SQL] VARCHAR(300) , --执行的SQL语句
  6. USERID VARCHAR(128) NOT NULL DEFAULT ( SUSER_SNAME() ) , --连接的时候使用的哪个SQL登陆用户
  7. HOSTNAME VARCHAR(128) NOT NULL DEFAULT ( HOST_NAME() ) , --客户端的机器名
  8. LOGINID VARCHAR(128), --客户端的登陆用户(OS的用户)
  9. APPNAME VARCHAR(128)NOT NULL DEFAULT ( APP_NAME()) --是从查询分析器,还是应用程序来执行的
  10. )

        新建触发器:

  1. CREATE TRIGGER TR_TBTEST ON T
  2. FOR DELETE
  3. AS
  4. RAISERROR('错误',16,8)
  5. ROLLBACK TRAN
  6. --SQL
  7. CREATE TABLE #T
  8. (
  9. EVENTTYPE VARCHAR(20) ,
  10. PARAMETERS INT ,
  11. EVENTINFO VARCHAR(300)
  12. )
  13. DECLARE @SPID VARCHAR(20)
  14. SET @SPID = CAST(@@SPID AS VARCHAR)
  15. INSERT #T
  16. EXEC ( 'DBCC INPUTBUFFER (' + @SPID + ')'
  17. )
  18. --进程信息
  19. DECLARE @USERID VARCHAR(128) , --连接的时候使用的哪个SQL登陆用户
  20. @HOSTNAME VARCHAR(128) , --客户端的机器名
  21. @LOGINID VARCHAR(128) , --客户端的登陆用户(OS的用户)
  22. @APPNAME VARCHAR(128) --是从查询分析器,还是应用程序来执行的
  23. SELECT @USERID = LOGINAME , --连接的时候使用的哪个SQL登陆用户
  24. @HOSTNAME = HOSTNAME , --客户端的机器名
  25. @LOGINID = NT_USERNAME , --客户端的登陆用户(OS的用户)
  26. @APPNAME = PROGRAM_NAME --是从查询分析器,还是应用程序来执行的
  27. FROM MASTER..SYSPROCESSES
  28. WHERE SPID = @@SPID
  29. INSERT TBLOG
  30. ( SQL ,
  31. USERID ,
  32. HOSTNAME ,
  33. LOGINID ,
  34. APPNAME
  35. )
  36. SELECT EVENTINFO ,
  37. @USERID ,
  38. @HOSTNAME ,
  39. @LOGINID ,
  40. @APPNAME
  41. FROM #T
  42. GO

        测试删除:

DELETE FROM T WHERE id=1

        结果:


        查询日志和数据情况:

  1. SELECT * FROM TBLOG
  2. SELECT * FROM T

        结果:


        以上实现了我们想要的禁止删除并添加日志的功能,当然我们也可以把这个应用到INSERT、UPDATE等操作中。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多