给大家分享好东西喽!DDL触发器,追踪存储过程定义语句变更日志,及当前版本与上一版本。

USE [MyTargetDB]
GO

/****** Object:  DdlTrigger [DDL_PROCEDURE_TRIGGER_CREATE_ALTER_DROP]    Script Date: 04/09/2013 09:47:14 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATE TRIGGER [DDL_PROCEDURE_TRIGGER_CREATE_ALTER_DROP] ON DATABASE
    FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
    /*
作者:陈恩辉
本触发器只对 CREATE_PROCEDURE, ALTER_PROCEDURE,DROP_PROCEDURE 进行跟踪
历史日志写入 ddl_proc_log
最新两次不同脚本写入 ddl_proc_last_current
*/

    SET NOCOUNT ON
    BEGIN
        IF OBJECT_ID('[dbo].[ddl_proc_last_current]', 'U') IS NULL 
            CREATE TABLE [dbo].[ddl_proc_last_current]
                (
                  [rowid] [int] IDENTITY(1, 1) NOT NULL ,
                  [EventType] [varchar](20) NULL ,
                  [PostTime] [datetime] NULL ,
                  [SPID] [int] NULL ,
                  [ServerName] [varchar](255) NULL ,
                  [LoginName] [varchar](255) NULL ,
                  [DatabaseName] [varchar](255) NULL ,
                  [SchemaName] [varchar](20) NULL ,
                  [ObjectName] [nvarchar](128) NULL ,
                  [ObjectType] [nvarchar](20) NULL ,
                  [CommandText] [varchar](MAX) NULL ,
                  [version] [varchar](20) NULL
                )
            ON  [PRIMARY]


        IF OBJECT_ID('[dbo].[ddl_proc_log]', 'U') IS NULL 
            CREATE TABLE [dbo].[ddl_proc_log]
                (
                  [rowid] [int] IDENTITY(1, 1) NOT NULL ,
                  [EventType] [varchar](20) NULL ,
                  [PostTime] [datetime] NULL ,
                  [SPID] [int] NULL ,
                  [ServerName] [varchar](255) NULL ,
                  [LoginName] [varchar](255) NULL ,
                  [DatabaseName] [varchar](255) NULL ,
                  [SchemaName] [varchar](20) NULL ,
                  [ObjectName] [nvarchar](128) NULL ,
                  [ObjectType] [nvarchar](20) NULL ,
                  [CommandText] [nvarchar](MAX) NULL ,
                  [remark] [varchar](50) NULL ,
                  [commandtext_check] AS ( CHECKSUM([commandtext]) ) PERSISTED
                )
            ON  [PRIMARY]



        DECLARE @EventType VARCHAR(20) ,
            @PostTime DATETIME ,
            @SPID INT ,
            @ServerName VARCHAR(255) ,
            @LoginName VARCHAR(255) ,
            @DatabaseName VARCHAR(255) ,
            @SchemaName VARCHAR(20) ,
            @ObjectName NVARCHAR(128) ,
            @ObjectType NVARCHAR(20) ,
            @CommandText NVARCHAR(MAX)

        ----解析事件字段内容
        SELECT  @EventType = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]',
                                               'nvarchar(max)') ,
                @PostTime = EVENTDATA().value('(/EVENT_INSTANCE/PostTime)[1]',
                                              'datetime') ,
                @SPID = EVENTDATA().value('(/EVENT_INSTANCE/SPID)[1]', 'int') ,
                @ServerName = EVENTDATA().value('(/EVENT_INSTANCE/ServerName)[1]',
                                                'nvarchar(max)') ,
                @LoginName = EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]',
                                               'nvarchar(max)') ,
                @DatabaseName = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]',
                                                  'nvarchar(max)') ,
                @SchemaName = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]',
                                                'nvarchar(max)') ,
                @ObjectName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]',
                                                'nvarchar(max)') ,
                @ObjectType = EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]',
                                                'nvarchar(max)') ,
                @CommandText = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]',
                                                 'nvarchar(max)')  
        ----写入执行日志表
        INSERT  INTO dbo.ddl_proc_log
                ( EventType ,
                  PostTime ,
                  SPID ,
                  ServerName ,
                  LoginName ,
                  DatabaseName ,
                  SchemaName ,
                  ObjectName ,
                  ObjectType ,
                  CommandText
                   
                )
                SELECT  @EventType ,
                        @PostTime ,
                        @SPID ,
                        @ServerName ,
                        @LoginName ,
                        @DatabaseName ,
                        @SchemaName ,
                        @ObjectName ,
                        @ObjectType ,
                        @CommandText
        ----当脚本发生变化时,进行写入;并且只保留最近两次不同脚本;                
        IF ( @EventType IN ( 'CREATE_PROCEDURE', 'ALTER_PROCEDURE' )
             AND NOT EXISTS ( SELECT    1
                              FROM      dbo.ddl_proc_last_current a
                              WHERE     a.ObjectName = @ObjectName
                                        AND a.CommandText = @CommandText )
           ) 
            BEGIN
            ----写入最新不同脚本				          
                INSERT  INTO wfp.dbo.ddl_proc_last_current
                        ( EventType ,
                          PostTime ,
                          SPID ,
                          ServerName ,
                          LoginName ,
                          DatabaseName ,
                          SchemaName ,
                          ObjectName ,
                          ObjectType ,
                          CommandText
                           
                        )
                        SELECT  @EventType ,
                                @PostTime ,
                                @SPID ,
                                @ServerName ,
                                @LoginName ,
                                @DatabaseName ,
                                @SchemaName ,
                                @ObjectName ,
                                @ObjectType ,
                                @CommandText ;
                ----删除历史最旧版本,保留最近两次不同的最新版本
                WITH    cte1
                          AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY ObjectName ORDER BY rowid DESC ) xh ,
                                        *
                               FROM     dbo.ddl_proc_last_current
                               WHERE    ObjectName = @ObjectName
                             )
                    DELETE  FROM cte1
                    WHERE   xh > 2 ;
                ----对两次最新版本信息进行标记    
                WITH    cte2
                          AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY ObjectName ORDER BY rowid DESC ) xh ,
                                        *
                               FROM     dbo.ddl_proc_last_current
                               WHERE    ObjectName = @ObjectName
                             )
                    UPDATE  cte2
                    SET     version = CASE WHEN xh = 1 THEN 'current'
                                           ELSE 'last'
                                      END  
                                             

            END

    END                            
    SET NOCOUNT OFF





GO

SET ANSI_NULLS OFF
GO

SET QUOTED_IDENTIFIER OFF
GO

DISABLE TRIGGER [DDL_PROCEDURE_TRIGGER_CREATE_ALTER_DROP] ON DATABASE
GO

ENABLE TRIGGER [DDL_PROCEDURE_TRIGGER_CREATE_ALTER_DROP] ON DATABASE
GO






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值