zoukankan      html  css  js  c++  java
  • Sqlserver:利用Sqlserver2005的数据库触发器开发的数据库审核追踪系统,可以跟踪对象的修改信息及修改源代码

    建立跟踪的相关表

       --触发事件记录表
        CREATE TABLE [VER_EVENT](
            [SN] bigint identity(1,1),
            [LoginName] SYSNAME NULL,
            [PostTime] [datetime] NULL,
            [DatabaseName] SYSNAME NULL,
            [EventType] SYSNAME NULL,
            [ObjectType] SYSNAME NULL,
            [ObjectName] SYSNAME NULL,
            [CommandText] [nvarchar](max) NULL
        ) ON [PRIMARY]
        GO

        --版本控制表
        CREATE TABLE [VER_CONTROL](
            [SN] [bigint] IDENTITY(1,1) NOT NULL,
            [DatabaseName] [sysname] NULL,
            [ObjectType] [sysname] NULL,
            [ObjectName] [sysname] NULL,
            [Version] [int] NULL,
            [SN_EVENT] [bigint] NULL
        ) ON [PRIMARY]

    建立触发器

    /************************************************************************
    -- 功        能:数据库的对象版本跟踪系统
    -- 日        期:2008-10-09
    -- 作        者:
    -- 参       数:
    -- 返    回    值:
    -- 说        明:有两个相关的表
    ************************************************************************/
    --CREATE TRIGGER VERSION_CONTROL
    ALTER TRIGGER [VERSION_CONTROL]
    ON DATABASE
    FOR   
        CREATE_TABLE,ALTER_TABLE,DROP_TABLE,
        CREATE_PROCEDURE,ALTER_PROCEDURE,DROP_PROCEDURE,
        CREATE_FUNCTION,ALTER_FUNCTION,DROP_FUNCTION
    AS
    BEGIN

        SET NOCOUNT ON
           
        DECLARE @ObjectName SYSNAME
        DECLARE @EventType SYSNAME
        DECLARE @DatabaseName SYSNAME
        DECLARE @ObjectType SYSNAME
        DECLARE @CommandText NVARCHAR(MAX)   
        DECLARE @Ver INT
        DECLARE @SN INT
       
        SET @Ver = NULL
        SET @DatabaseName = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','sysname')
        SET @ObjectType = EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]','sysname')
        SET @ObjectName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','sysname')
        SET @EventType = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]','sysname')
        SET @CommandText = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')

        INSERT INTO VER_EVENT([LoginName],[PostTime],[DatabaseName],[EventType],[ObjectType],[ObjectName],[CommandText])
        SELECT
                EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]','sysname') as LoginName,
                EVENTDATA().value('(/EVENT_INSTANCE/PostTime)[1]','datetime') as PostTime,
                @DatabaseName,@EventType,@ObjectType,@ObjectName,@CommandText
        SET @SN = @@IDENTITY

        SELECT @Ver = [Version]
        FROM VER_CONTROL
        WHERE    [DatabaseName] = @DatabaseName    AND [ObjectType] = @ObjectType    AND    [ObjectName] = @ObjectName

        IF @EventType LIKE 'CREATE%' AND @ObjectName NOT LIKE 'T%'
        BEGIN
            IF @Ver IS NULL
                INSERT INTO [VER_CONTROL]([DatabaseName],[ObjectType],[ObjectName],[Version],[SN_EVENT])
                SELECT @DatabaseName,@ObjectType,@ObjectName,10001,0
            ELSE
                UPDATE  VER_CONTROL
                SET [Version] =  @Ver + 10000,[SN_EVENT] = @SN
                WHERE  [DatabaseName] = @DatabaseName    AND [ObjectType] = @ObjectType    AND    [ObjectName] = @ObjectName
        END
        IF @EventType LIKE 'ALTER%' AND @ObjectName NOT LIKE 'T%'
        BEGIN
            IF @Ver IS NULL
                INSERT INTO [VER_CONTROL]([DatabaseName],[ObjectType],[ObjectName],[Version],[SN_EVENT])
                SELECT @DatabaseName,@ObjectType,@ObjectName,10001,0
            ELSE
                UPDATE  VER_CONTROL
                SET [Version] = @Ver + 1,[SN_EVENT] = @SN
                WHERE  [DatabaseName] = @DatabaseName    AND [ObjectType] = @ObjectType    AND    [ObjectName] = @ObjectName
        END
        IF @EventType LIKE 'DROP%' AND @ObjectName NOT LIKE 'T%'
        BEGIN
            IF @Ver IS NULL
                INSERT INTO [VER_CONTROL]([DatabaseName],[ObjectType],[ObjectName],[Version],[SN_EVENT])
                SELECT @DatabaseName,@ObjectType,@ObjectName,-10001,0
            ELSE
                UPDATE  VER_CONTROL
                SET [Version] =  @Ver * (-1),[SN_EVENT] = @SN
                WHERE  [DatabaseName] = @DatabaseName    AND [ObjectType] = @ObjectType    AND    [ObjectName] = @ObjectName
            RETURN
        END

  • 相关阅读:
    绑定方式开始服务&调用服务的方法
    采用服务窃听电话示例
    后台服务运行示例
    Android短信监听器——示例
    利用广播实现ip拨号——示例
    Android图片的合成示例
    IIS 7.5 发布Web 网站步骤
    C# 中 多线程同步退出方案 CancellationTokenSource
    UML 类图常用表示方法.
    Socket Receive 避免 Blocking
  • 原文地址:https://www.cnblogs.com/jinzhenshui/p/1503227.html
Copyright © 2011-2022 走看看