经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库运维 » MS SQL Server » 查看文章
存储过程代码自动备份
来源:cnblogs  作者:刀奈特程序员  时间:2018/9/30 10:53:23  对本文有异议

  首先在master库下建立表ProcSqlTableBackProcSqlTableProcSqlTable存放存储过程当前版本代码,BackProcSqlTable存放历史版本代码。

  1. USE [master]
  2. GO
  3. CREATE TABLE [dbo].[BackProcSqlTable](
  4. [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY ,--编号
  5. [dbName] [nvarchar](150) NOT NULL,--数据库名
  6. [ProcSQL] [ntext] NOT NULL,--存储过程的SQL
  7. [ProcName] [nvarchar](150) NOT NULL,--存储过程名字
  8. [AlterDate] [datetime] NOT NULL,--修改时间
  9. [AlterUser] [nvarchar](150) NULL--修改人
  10. )
  11. GO
  12.  
  13.  
  14.  
  15. USE [master]
  16. GO
  17. CREATE TABLE [dbo].[ProcSqlTable](
  18. [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,--编号
  19. [dbName] [nvarchar](150) NOT NULL,--数据名
  20. [ProcSQL] [ntext] NOT NULL,--存储过程SQL
  21. [ProcName] [nvarchar](150) NOT NULL--存储过程名字
  22. )
  23. GO

  接下来需要建立两个库级(DDL)触发器:tr_saveProcSql和tr_saveBackProcSql。tr_saveProcSql将新建存储过程代码写入ProcSqlTable,tr_saveBackProcSql将ProcSqlTable表中保存的代码写到BackProcSqlTable中作为历史版本代码,同时将存储过程当前代码更新到ProcSqlTable。

  1. USE [master]
  2. GO
  3. create trigger [tr_saveProcSql]
  4. on all server --作用于SQL Server实例下所有库
  5. for CREATE_PROCEDURE
  6. as
  7. --获取事件数据
  8. DECLARE @data XML
  9. SET @data = EVENTDATA()
  10. declare @dbName nvarchar(50)
  11. declare @ProcName nvarchar(150)
  12. declare @ProcSQL nvarchar(max)
  13. --获取新建存储过程的数据库名
  14. SET @dbName = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname')
  15. --获取新建存储过程的名字
  16. set @ProcName= @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')
  17. --获取新建存储过程的内容
  18. set @ProcSQL = @data.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'sysname')
  19. --将数据库名、存储过程名以及存储过程内容插入ProcSqlTable
  20. insert into [master].[dbo].[ProcSqlTable]([dbName],[ProcName],[ProcSQL])
  21. values(@dbName,@ProcName,@ProcSQL)
  22. GO
  23. ENABLE TRIGGER [tr_saveProcSql] ON ALL SERVER
  24. GO
  1. USE [master]
  2. GO
  3. create trigger [tr_saveBackProcSql]
  4. on all server --作用于SQL Server实例下所有库
  5. for ALTER_PROCEDURE
  6. as
  7. --获取事件数据
  8. DECLARE @data XML
  9. SET @data = EVENTDATA()
  10. declare @dbName nvarchar(50)
  11. declare @ProcName nvarchar(150)
  12. declare @LoginName nvarchar(150)
  13. declare @ProcSQL nvarchar(max) --存储过程内容
  14. declare @OldProcSQL nvarchar(max)--修改前的存储过程内容
  15.  
  16. --获取修改存储过程的数据库名
  17. SET @dbName = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname')
  18. --获取修改存储过程的名字
  19. set @ProcName= @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')
  20. --获取修改存储过程的内容
  21. set @ProcSQL = @data.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'sysname')
  22. --获取用户名
  23. set @LoginName = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname')
  24. if exists(select 1 from [master].[dbo].[ProcSqlTable] where [dbName]=@dbName and [ProcName]=@ProcName)
  25. begin
  26. --如果系统里有该存储过程的记录,获取修改前的存储过程内容
  27. select @OldProcSQL=[ProcSQL]
  28. from [master].[dbo].[ProcSqlTable]
  29. where [dbName]=@dbName and [ProcName]=@ProcName
  30. end
  31. else
  32. begin
  33. --如果没有将数据库名、存储过程名以及存储过程内容插入ProcSqlTable
  34. insert into [master].[dbo].[ProcSqlTable]([dbName],[ProcName],[ProcSQL])
  35. values(@dbName,@ProcName,@ProcSQL)
  36. --退出
  37. return
  38. end
  39.  
  40. --更新ProcSqlTable表存储过程的内容供下次使用
  41. update [master].[dbo].[ProcSqlTable]
  42. set [ProcSQL]=@ProcSQL
  43. where [dbName]=@dbName and [ProcName]=@ProcName
  44.  
  45. --将数据库名、存储过程名以及修改前的存储过程内容插入BackProcSqlTable
  46. insert into [master].[dbo].[BackProcSqlTable]([dbName],[ProcName],[ProcSQL],[AlterDate],[AlterUser])
  47. values(@dbName,@ProcName,@OldProcSQL,GETDATE(),@LoginName)
  48. GO
  49. ENABLE TRIGGER [tr_saveBackProcSql] ON ALL SERVER
  50. GO

 

=====================================================================================
本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号