SQL Server 2005 数据修改日志

SQL Server 2005 数据修改日志

方案效果

使用DML触发器,相关的操作记录到EditLog表

USE Northwind
GO
UPDATE Customers
  SET CompanyName = 'MicroSoft'
  WHERE customerid = 'ALFKI'
select * from EditLog where ID = 1

 当DML发生在存储过程,并且有传入用户ID时,还可以记录存储过程和用户ID

EXEC dbo.SetDoInfo  @DoUserID = 9527,  @DoProc = 'HocTest'--写在存储过程开头

UPDATE Customers
  SET CompanyName = 'IBM'
  WHERE customerid = 'ANATR'

EXEC dbo.sp_TrgSignal_Clear @pos = 1; -------写在存储过程末尾
select * from EditLog where ID = 4

删除数据时,将删除的数据插入到DelLog表

delete Customers where CustomerID = 'WOLZA'
select * from DelLog

通用查询结果,该结果不用额外写查询

可读性更强的专用查询结果,需要额外写查询来支持

实现过程

相关数据库 Northwind、Master

  1. 创建相关表、函数、和存储过程
    见其他脚本
  2. 利用存储过程 sp_GetUpdateStr 生成触发器脚本和 维护 TbList、TbCol的脚本
    --用于生成触发器脚本
    EXEC sp_GetUpdateStr 
    @TbName = 'Customers',
    @TbNameCh = '客户表',
    @keyCol = 'CustomerID',
    @colstr = 'CustomerID,CompanyName,ContactName,Address,City,PostalCode,Country,Phone,Fax',
    @colstrCh = '客户ID,公司,姓名,地址,城市,邮编,国家,电话,传真'

    执行的时候用 “以文本格式显示结果”,并把每列显示调到最大

  3. 对记录的表进行一些新增、修改、删除操作
  4. 利用存储过程 LogQuery 进行通用查询
    EXEC LogQuery     
        @DbName  = 'Northwind',
        @TbName  = 'Customers', 
        @Item = 'CompanyName', 
        @value = 'IBM', 
        @bgntime = '2014-04-01',
        @endtime = '2014-04-30'

     

  5. 利用存储过程 VarLogQuery 进行专用查询
    EXEC VarLogQuery
        @DbName  = 'Northwind',
        @TbName  = 'Customers', 
        @Item = 'CompanyName', 
        @value = 'IBM', 
        @bgntime = '2014-04-01',
        @endtime = '2014-04-30'

     

其他脚本

--用于记录日志
USE Northwind
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
/*创建日志表*/--========================
CREATE TABLE [dbo].[EditLog]
  (
   [ID] [bigint] IDENTITY(1, 1)
                 NOT NULL ,
   [DbName] [varchar](50) NULL ,
   [TbName] [varchar](50) NOT NULL ,
   [KeyCol] [sql_variant] NULL ,
   [KeyCol2] [sql_variant] NULL ,
   [KeyCol3] [sql_variant] NULL ,
   [DoType] [int] NOT NULL ,
   [ColName] [varchar](50) NULL ,
   [OldValue] [sql_variant] NULL ,
   [NewValue] [sql_variant] NULL ,
   [DoWhere] [varchar](100) NULL ,
   [DoUserID] [int] NULL ,
   [CrtDate] [datetime] NOT NULL
  )

GO

SET ANSI_PADDING OFF
GO

EXEC sys.sp_addextendedproperty
  @name = N'MS_Description' ,
  @value = N'0新增,1修改,2删除' ,
  @level0type = N'SCHEMA' ,
  @level0name = N'dbo' ,
  @level1type = N'TABLE' ,
  @level1name = N'EditLog' ,
  @level2type = N'COLUMN' ,
  @level2name = N'DoType'
GO

ALTER TABLE [dbo].[EditLog] ADD  CONSTRAINT [DF_EditLog_EType]  DEFAULT ((0)) FOR [DoType]
GO

ALTER TABLE [dbo].[EditLog] ADD  CONSTRAINT [DF_EditLog_CrtDate]  DEFAULT (GETDATE()) FOR [CrtDate]
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[DelLog](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [DbName] [varchar](50) NULL,
    [TbName] [varchar](50) NULL,
    [DoWhere] [varchar](100) NULL,
    [DoUserID] [int] NULL,
    [CrtDate] [datetime] NULL,
    [Col1] [sql_variant] NULL,
    [Col2] [sql_variant] NULL,
    [Col3] [sql_variant] NULL,
    [Col4] [sql_variant] NULL,
    [Col5] [sql_variant] NULL,
    [Col6] [sql_variant] NULL,
    [Col7] [sql_variant] NULL,
    [Col8] [sql_variant] NULL,
    [Col9] [sql_variant] NULL,
    [Col10] [sql_variant] NULL,
    [Col11] [sql_variant] NULL,
    [Col12] [sql_variant] NULL,
    [Col13] [sql_variant] NULL,
    [Col14] [sql_variant] NULL,
    [Col15] [sql_variant] NULL,
    [Col16] [sql_variant] NULL,
    [Col17] [sql_variant] NULL,
    [Col18] [sql_variant] NULL,
    [Col19] [sql_variant] NULL,
    [Col20] [sql_variant] NULL,
    [Col21] [sql_variant] NULL,
    [Col22] [sql_variant] NULL,
    [Col23] [sql_variant] NULL,
    [Col24] [sql_variant] NULL,
    [Col25] [sql_variant] NULL,
    [Col26] [sql_variant] NULL,
    [Col27] [sql_variant] NULL,
    [Col28] [sql_variant] NULL,
    [Col29] [sql_variant] NULL,
    [Col30] [sql_variant] NULL,
    [Col31] [sql_variant] NULL,
    [Col32] [sql_variant] NULL,
    [Col33] [sql_variant] NULL,
    [Col34] [sql_variant] NULL,
    [Col35] [sql_variant] NULL,
    [Col36] [sql_variant] NULL,
    [Col37] [sql_variant] NULL,
    [Col38] [sql_variant] NULL,
    [Col39] [sql_variant] NULL,
    [Col40] [sql_variant] NULL,
    [Col41] [sql_variant] NULL,
    [Col42] [sql_variant] NULL,
    [Col43] [sql_variant] NULL,
    [Col44] [sql_variant] NULL,
    [Col45] [sql_variant] NULL,
    [Col46] [sql_variant] NULL,
    [Col47] [sql_variant] NULL,
    [Col48] [sql_variant] NULL,
    [Col49] [sql_variant] NULL,
    [Col50] [sql_variant] NULL
)

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[DelLog] ADD  CONSTRAINT [DF__DelLog__CrtDate__571DF1D5]  DEFAULT (getdate()) FOR [CrtDate]
GO
/*创建日志表*/--========================


/*创建配置表*/--========================
CREATE TABLE [dbo].[TbList]
  (
   [TbID] [bigint] IDENTITY(1, 1)
                   NOT NULL ,
   [DbName] [varchar](50) NOT NULL ,
   [TbName] [varchar](50) NOT NULL ,
   [Descript] [varchar](50) NOT NULL ,
   [KeyCol] [varchar](50) NOT NULL ,
   [KeyCol2] [varchar](50) NULL ,
   [KeyCol3] [varchar](50) NULL ,
   CONSTRAINT [PK_TbList] PRIMARY KEY CLUSTERED ([TbID] ASC)
  )

GO
CREATE TABLE [dbo].[TbCol]
  (
   [ID] [bigint] IDENTITY(1, 1)
                 NOT NULL ,
   [TbID] [bigint] NOT NULL ,
   [ColName] [varchar](50) NOT NULL ,
   [Descript] [varchar](50) NOT NULL ,
   [ColType] [varchar](50) NOT NULL ,
   [IsFilter] [bit] NULL ,
   CONSTRAINT [PK_TbCol] PRIMARY KEY CLUSTERED ([TbID] ASC, [ColName] ASC)
  ) 
GO
EXEC sys.sp_addextendedproperty
  @name = N'MS_Description' ,
  @value = N'字段类型' ,
  @level0type = N'SCHEMA' ,
  @level0name = N'dbo' ,
  @level1type = N'TABLE' ,
  @level1name = N'TbCol' ,
  @level2type = N'COLUMN' ,
  @level2name = N'ColType'
GO

EXEC sys.sp_addextendedproperty
  @name = N'MS_Description' ,
  @value = N'是否作为自定义筛选条件' ,
  @level0type = N'SCHEMA' ,
  @level0name = N'dbo' ,
  @level1type = N'TABLE' ,
  @level1name = N'TbCol' ,
  @level2type = N'COLUMN' ,
  @level2name = N'IsFilter'
GO

ALTER TABLE [dbo].[TbCol]  WITH CHECK ADD  CONSTRAINT [FK_TbCol_TbList] FOREIGN KEY([TbID])
REFERENCES [dbo].[TbList] ([TbID])
GO
ALTER TABLE [dbo].[TbCol] CHECK CONSTRAINT [FK_TbCol_TbList]
GO
ALTER TABLE [dbo].[TbCol] ADD  CONSTRAINT [DF_TbCol_IsFilter]  DEFAULT ((0)) FOR [IsFilter]
GO
/*创建配置表*/--========================

/*利用上下文信息获取操作用户和执行位置*/--========================
/*设置上下文标志过程*/
CREATE PROC dbo.sp_TrgSignal_Set
  @guid AS BINARY(16),
  @pos  AS INT
AS

DECLARE @ci AS VARBINARY(128);
SET @ci = 
  ISNULL(SUBSTRING(CONTEXT_INFO(), 1, @pos-1),
         CAST(REPLICATE(0x00, @pos-1) AS VARBINARY(128)))
  + @guid +
  ISNULL(SUBSTRING(CONTEXT_INFO(), @pos+16, 128-16-@pos+1), 0x);
SET CONTEXT_INFO @ci;
GO
/*清除上下文标志过程*/
CREATE PROC dbo.sp_TrgSignal_Clear
  @pos  AS INT
AS

DECLARE @ci AS VARBINARY(128);
SET @ci = 
  ISNULL(SUBSTRING(CONTEXT_INFO(), 1, @pos-1),
         CAST(REPLICATE(0x00, @pos-1) AS VARBINARY(128)))
  + CAST(REPLICATE(0x00, 16) AS VARBINARY(128)) +
  ISNULL(SUBSTRING(CONTEXT_INFO(), @pos+16, 128-16-@pos+1), 0x);
SET CONTEXT_INFO @ci;
GO
/*读取上下文标志过程*/
CREATE PROC dbo.sp_TrgSignal_Get
  @guid AS BINARY(16) OUTPUT,
  @pos  AS INT
AS

SET @guid = SUBSTRING(CONTEXT_INFO(), @pos, 16);
GO

CREATE PROC dbo.SetDoInfo
    @DoUserID int ,
    @DoProc varchar(50)
as
BEGIN
    SET NOCOUNT ON
    declare @guid binary(100)
    SET @guid = CAST(ISNULL(@DoProc,'')+'#' + CAST(ISNULL(@DoUserID,0) AS VARCHAR(50)) + '$' as binary(100))
    EXEC dbo.sp_TrgSignal_Set
        @guid = @guid,
        @pos = 1;----------设置上下文标志,用于告诉触发器操作人员  
END

GO
CREATE PROC dbo.GetDoInfo
    @DoUserID int OUTPUT,
    @DoProc varchar(50) OUTPUT
as
BEGIN
    DECLARE @signal AS binary(100),@s VARCHAR(100),@DoUserIDs varchar(50);
    EXEC dbo.sp_TrgSignal_Get
  @guid = @signal OUTPUT,
  @pos  = 1;
  IF CHARINDEX('$',@signal) = 0 return
  set @s = LEFT(@signal,CHARINDEX('$',@signal)-1)
  SET @DoUserID = STUFF(@s,1,CHARINDEX('#',@s),'') 
  SET @DoProc = LEFT(@s,CHARINDEX('#',@s)-1)
END
GO
/*利用上下文信息获取操作用户和执行位置*/--========================

/*拆分字符串函数*/--===========================
USE MASTER
GO  
CREATE   FUNCTION [dbo].[fn_split]
  (
   @c VARCHAR(MAX) ,
   @split VARCHAR(2)
  )
RETURNS @t TABLE (pos INT, col VARCHAR(20))
AS
BEGIN     
  DECLARE @pos INT  
      
  SET @pos = 0   
  WHILE (CHARINDEX(@split, @c) <> 0)
    BEGIN  
      SET @pos += 1       
      INSERT @t (pos, col)
        VALUES (@pos, SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1))     
      SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')     
    END  
  SET @pos += 1         
  INSERT @t (pos, col)
    VALUES (@pos, @c)     
  RETURN     
END    
GO
/*拆分字符串函数*/--===========================

/*CLR聚合字符串函数*/--========================
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
CREATE ASSEMBLY [GetSumStrNew]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103007DFF224B0000000000000000E0000E210B010800001000000020000000000000BE2900000020000000400000000040000020000000100000040000000000000004000000000000000080000000100000000000000300000400001000001000000000100000100000000000001000000000000000000000006829000053000000004000003803000000000000000000000000000000000000006000000C000000F82800001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000C4090000002000000010000000100000000000000000000000000000200000602E7273726300000038030000004000000010000000200000000000000000000000000000400000402E72656C6F6300000C00000000600000001000000030000000000000000000000000000040000042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A029000000000000480000000200050000210000F80700000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000360002731100000A7D010000042A0000133002003100000001000011000F01281200000A16FE010A062D0E007201000070281300000A100100027B010000040F01281400000A6F1500000A262A5600027B010000040F017B010000046F1600000A262A0013300200160000000200001100027B010000046F1700000A731800000A0A2B00062A4E0002036F1900000A731A00000A7D010000042A520003027B010000046F1700000A6F1B00000A002A0042534A4201000100000000000C00000076322E302E35303732370000000005006C000000B0020000237E00001C0300009003000023537472696E677300000000AC0600000400000023555300B0060000100000002347554944000000C00600003801000023426C6F620000000000000002000001571702000900000000FA013300160000010000001A00000002000000010000000600000004000000010000001B0000000C00000002000000010000000200000000000A00010000000000060032002B000A00630048000600800074000A00BB00A6000600EA00E0000600FC00E000060021010F0106005F014001060073010F0106008C010F010600A7010F010600C2010F010600DB010F010600F4010F01060013020F01060030020F0106005A02470247006E02000006009D027D020600BD027D020600DB022B000A00F10248000A001203480006001903400106002F03400106006E032B000000000001000000000001000100092110001800000005000100010001008E000A005020000000008600A1000E0001006020000000008600C500120001009D20000000008600D00018000200B420000000008600D6001E000300D62000000000E601F70023000300EA2000000000E601090129000400000001003A03000001006803000001007E03000001008B030200090039003A012F0041003A01340049003A012F0051003A012F0059003A012F0061003A012F0069003A012F0071003A012F0079003A012F0081003A012F0089003A01390099003A013F00A1003A010E00A9003A010E00B1003A014400C1003A01AC0019003A010E0021004003B20021004B03B60021005703BC0019006103C00019006103CA00D1007503BC0021003A012F0029008003BC0019003A012F00310009012F002E003B00D5002E001300D5002E002300D5002E002B00DB002E003300F7002E005300F7002E006B0018012E004B00D5002E004300D5002E005B0006012E0063000F0143007B004A00C600D0000480000001000000310E7E4900000000000018000000020000000000000000000000010022000000000002000000000000000000000001003C000000000000000000003C4D6F64756C653E0047657453756D5374722E646C6C0047657453756D537472006D73636F726C69620053797374656D0056616C7565547970650053797374656D2E44617461004D6963726F736F66742E53716C5365727665722E536572766572004942696E61727953657269616C697A650053797374656D2E5465787400537472696E674275696C64657200696E7465726D656469617465526573756C7400496E69740053797374656D2E446174612E53716C54797065730053716C537472696E6700416363756D756C617465004D65726765005465726D696E6174650053797374656D2E494F0042696E61727952656164657200526561640042696E6172795772697465720057726974650053797374656D2E5265666C656374696F6E00417373656D626C7956657273696F6E417474726962757465002E63746F720053797374656D2E52756E74696D652E496E7465726F70536572766963657300436F6D56697369626C6541747472696275746500417373656D626C7943756C7475726541747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C795469746C654174747269627574650053797374656D2E446961676E6F73746963730044656275676761626C6541747472696275746500446562756767696E674D6F6465730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053657269616C697A61626C654174747269627574650053716C55736572446566696E656441676772656761746541747472696275746500466F726D6174005374727563744C61796F7574417474726962757465004C61796F75744B696E640056616C7565006765745F49734E756C6C006F705F496D706C69636974006765745F56616C756500417070656E640047726F7570004F626A65637400546F537472696E6700720052656164537472696E6700770000000000010000C0F782B66ED85547A928BD02753889C20008B77A5C561934E0890306120D032000010520010111110520010111080420001111052001011215052001011219042001010E0420010102052001011149042001010805200101115D6101000200000004005402124973496E76617269616E74546F4E756C6C73015402174973496E76617269616E74546F4475706C696361746573005402124973496E76617269616E74546F4F726465720054080B4D61784279746553697A65401F00000520010111650320000205000111110E0320000E052001120D0E03070102052001120D1C04070111110501000000001B010016E78988E69D83E68980E69C892028432920203230303900000E01000947657453756D53747200000801000701000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F77730100000000007DFF224B0000000002000000520000001429000014190000525344538B0B616C717F7E45B9EC49CAD003F5FD06000000463A5C7A646C5C446F744E65745C53514C53756D5374725C47657453756D5374725C6F626A5C44656275675C47657453756D5374722E706462000000902900000000000000000000AE290000002000000000000000000000000000000000000000000000A029000000000000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF250020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000DC0200000000000000000000DC0234000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001007E49310E000001007E49310E3F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B0043C020000010053007400720069006E006700460069006C00650049006E0066006F0000001802000001003000300030003000300034006200300000003C000A000100460069006C0065004400650073006300720069007000740069006F006E0000000000470065007400530075006D00530074007200000040000F000100460069006C006500560065007200730069006F006E000000000031002E0030002E0033003600330033002E0031003800380031003400000000003C000E00010049006E007400650072006E0061006C004E0061006D0065000000470065007400530075006D005300740072002E0064006C006C00000044000F0001004C006500670061006C0043006F0070007900720069006700680074000000487243674062096720002800430029002000200032003000300039000000000044000E0001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000470065007400530075006D005300740072002E0064006C006C00000034000A000100500072006F0064007500630074004E0061006D00650000000000470065007400530075006D00530074007200000044000F000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0033003600330033002E00310038003800310034000000000048000F00010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0033003600330033002E003100380038003100340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000C039000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = SAFE
GO

CREATE
AGGREGATE [dbo].[fn_GetSumStr] (@inputStr [nvarchar](200)) RETURNS[nvarchar](max) EXTERNAL NAME [GetSumStrNew].[JionStr] GO /*CLR聚合字符串函数*/--========================
USE master
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
-- Author:      DBA谭
-- Create date: 
-- Description:    
-- Memo:        
*/
alter PROC sp_GetUpdateStr 
    @TbName varchar(50),
    @TbNameCh varchar(50) = '',
    @keyCol varchar(150),    
    @colstr varchar(500),
    @colstrCh varchar(1000) = ''
as
BEGIN
    SET NOCOUNT ON
    DECLARE @DelColStr varchar(2000),@keycollist varchar(150),
                    @inskeycolvalue varchar(150),@joinkeycolvalue varchar(150),
                    @keycolvalue varchar(150),@keycolname varchar(150),@DelColValue varchar(500)
    select    @DelColStr = master.dbo.fn_GetSumStr(', Col'+CAST(column_id AS VARCHAR(10))), 
                    @DelColValue = master.dbo.fn_GetSumStr(', ['+name+']')
        from sys.columns 
                                where object_id= object_id(@TbName)                               
    select    @keycollist = master.dbo.fn_GetSumStr('[keycol'+isnull(CAST(NULLIF(pos,1) AS VARCHAR(10)),'')+'], '),
                    @inskeycolvalue = master.dbo.fn_GetSumStr('i.['+col +'], '),
                    @keycolvalue = master.dbo.fn_GetSumStr('['+col +'], '),
                    @keycolname = master.dbo.fn_GetSumStr(''''+col +''', '),
                    @joinkeycolvalue = master.dbo.fn_GetSumStr(' i.['+col+'] = d.['+col+']
                     and ')         
        from master.dbo.fn_split(@keyCol,',') 
        
select 
'
USE ['+db_name()+']
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
-- Author:      DBA谭
-- Create date: 
-- Description:    
-- Memo:        
*/
CREATE TRIGGER trg_'+@TbName+' ON [dbo].['+@TbName+']                            
  for INSERT, UPDATE, DELETE                       
AS
BEGIN           
    if @@RowCount <= 0 Return                
    set nocount on
    declare @DelCnt int, @InsCnt int
    DECLARE @DoUserID int, @DoProc varchar(50)  --读取上下文信息
    EXEC dbo.GetDoInfo @DoUserID OUTPUT, @DoProc OUTPUT
    
    SELECT @DelCnt = COUNT(1) FROM deleted
    SELECT @InsCnt = COUNT(1) FROM inserted
    IF @DelCnt > 0 and @InsCnt > 0
    BEGIN 
    --插入修改日志     '
UNION ALL
select 
CASE WHEN is_identity = 1
THEN 
'
        if UPDATE(['+name+'])
        BEGIN
          raiserror(''不允许更新'+name+''',11,1)
            ROLLBACK
        END
'
ELSE
'
        if UPDATE(['+name+'])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, '+@keycollist+'DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), '''+@TbName+''', '+@inskeycolvalue+'1, '''+name+''', d.['+name+'], i.['+name+'], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on '+@joinkeycolvalue+' ISNULL(i.['+name+'],0) <> ISNULL(d.['+name+'],0)
        END
'
END
 from sys.columns where object_id= object_id(@TbName) AND ','+@colstr+',' like '%,'+name+',%'
UNION ALL
select 
'    END 
    ELSE IF @DelCnt = 0 and @InsCnt > 0    
    --插入新增日志   
    BEGIN
        INSERT INTO dbo.EditLog(DbName, TbName, '+@keycollist+'DoType, DoWhere, DoUserID)
        SELECT Db_Name(),'''+@TbName+''', '+@keycolvalue+'0, @DoProc, @DoUserID
            from inserted 
    END
    ELSE IF @DelCnt > 0 and @InsCnt = 0    
    --插入删除日志   
    BEGIN
        INSERT INTO dbo.EditLog(DbName, TbName, '+@keycollist+'DoType, DoWhere, DoUserID)
        SELECT Db_Name(), '''+@TbName+''', '+@keycolvalue+'2, @DoProc, @DoUserID
            from deleted 
        INSERT INTO dbo.DelLog(DbName, TbName, DoWhere, DoUserID'+@DelColStr+')
        SELECT Db_Name(), '''+@TbName+''', @DoProc, @DoUserID'+@DelColValue+'
            from deleted 
    END
END
GO
'
IF ISNULL(@TbNameCh,'')<>''
BEGIN
SELECT 'insert into TbList(DbName,TbName, '+@keycollist+'Descript)
select Db_Name(), '''+@TbName+''', '+@keycolname+''''+@TbNameCh+''''
SELECT 'insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, '''+a.col+''', '''+b.col+''',1,'''+
    type_name(c.user_type_id)+ CASE   
     WHEN type_name(c.user_type_id) IN('char','varchar','varbinary','binary')   
      THEN '('+case when c.max_length = -1 then 'max' ELSE CAST(c.max_length as varchar(10)) END +')'   
     WHEN type_name(c.user_type_id) IN('nchar','nvarchar')   
      THEN '('+case when c.max_length = -1 then 'max' ELSE CAST(c.max_length/2 as varchar(10)) END +')'      
     ELSE '' END
+'''
    FROM TbList WHERE DbName = Db_Name()    AND TbName = '''+@TbName+'''
'        
    from master.dbo.fn_split(@colstr,',') a 
        INNER JOIN master.dbo.fn_split(@colstrCh,',') b
            on a.pos = b.pos
        INNER JOIN sys.columns c ON c.object_id= object_id(@TbName) AND c.name = a.col
        
END


END
GO
USE master;EXEC sp_MS_marksystemobject 'dbo.sp_GetUpdateStr';  

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
go
    set ANSI_WARNINGS OFF
GO
/*
-- Author:      DBA谭
-- Create date: 
-- Description:    通用查询
-- Memo:    

*/
CREATE PROC LogQuery     
    @DbName varchar(50),
    @TbName varchar(50), 
    @Item varchar(50), 
    @value varchar(50), 
    @bgntime datetime,
    @endtime datetime,
    @DoType int = -1--(0新增,2删除,1修改,-1不限)
AS
BEGIN
    SET NOCOUNT ON
    declare @KeyColCnt int,
                    @KeyCol varchar(50),
                    @KeyCol2 varchar(50),
                    @KeyCol3 varchar(50),
                    @DbTbName varchar(50),
                    @TbID VARCHAR(10), @ColType varchar(50),
                    @DelLog VARCHAR(8000), 
                    @SQL NVARCHAR(MAX)
    select    @TbID = tl.TbID,
                    @KeyCol = tl.KeyCol,
                    @KeyCol2 = tl.KeyCol2,
                    @KeyCol3 = tl.KeyCol3,
                    @ColType = ISNULL(tc.ColType, 'int')
        from TbList tl 
            LEFT join TbCol tc 
                on tl.TbID = tc.TbID 
                and tc.ColName = @Item
            WHERE tl.DbName = @DbName 
                and tl.TbName = @TbName 
    SET @DbTbName = '['+@DbName+']..'+'['+@TbName+']'
    
    --插入列信息    
    CREATE TABLE #DelColList(ColName varchar(50), ColNoName varchar(50))
    SET @SQL = '
    INSERT INTO #DelColList(ColName, ColNoName)
        select name, ''Col''+CAST(column_id AS VARCHAR(10)) 
            from '+@DbName+'.sys.columns    
            where object_id= object_id('''+@DbTbName+''')
    '
    EXEC(@SQL)
    select @DelLog = 
    '
    ;WITH CET AS
    (
        select '+STUFF(MASTER.dbo.fn_GetSumStr(','+ColNoName+' AS '+ColName),1,1,'')+'
            from DelLog    
            WHERE DbName = '''+@DbName+'''
                and TbName = '''+@TbName+''' 
    )' from #DelColList
                 
    create table #T(keycol sql_variant,keycol2 sql_variant,keycol3 sql_variant)
    CREATE UNIQUE INDEX idx_unique on #T(keycol,keycol2,keycol3)with(ignore_dup_key = on)
    
    begin
        begin        
                
            SET @SQL = @SQL + '
                insert into #T(keycol,keycol2,keycol3) 
                    select dt.['+@KeyCol+'],'
                +case when @KeyCol2 is NULL then 'NULL'ELSE'dt.[' END 
                +ISNULL(@KeyCol2,'')
                +case when @KeyCol2 is NULL then ''ELSE']' END 
                +', '
                +case when @KeyCol3 is NULL then 'NULL'ELSE'dt.[' END 
                +ISNULL(@KeyCol3,'')
                +case when @KeyCol3 is NULL then ''ELSE']' END 
                +'
                        from ['+@DbName+']..['+@TbName+'] dt
                        where dt.['+@Item+'] = CAST('''+@value+''' AS '+@ColType+')    
            '    
          +@DelLog+'    
                insert into #T(keycol,keycol2,keycol3) 
                    select dt.['+@KeyCol+'],'
                +case when @KeyCol2 is NULL then 'NULL'ELSE'dt.[' END 
                +ISNULL(@KeyCol2,'')
                +case when @KeyCol2 is NULL then ''ELSE']' END 
                +', '
                +case when @KeyCol3 is NULL then 'NULL'ELSE'dt.[' END 
                +ISNULL(@KeyCol3,'')
                +case when @KeyCol3 is NULL then ''ELSE']' END 
                +'
                        from CET dt
                        where dt.['+@Item+'] = CAST('''+@value+''' AS '+@ColType+')    
            '    
            SET @SQL = @SQL + '
                insert into #T(keycol,keycol2,keycol3)  
                select DISTINCT KeyCol, KeyCol2, KeyCol3
                    from EditLog
                    where DbName = '''+@DbName+'''
                        and TbName = '''+@TbName+'''
                        and ColName = '''+@Item+''' 
                        and 
                            (
                                CAST(OldValue AS '+@ColType+') = CAST('''+@value+''' AS '+@ColType+')
                            or    CAST(NewValue AS '+@ColType+') = CAST('''+@value+''' AS '+@ColType+') 
                            )    
            '    
        END
        IF @Item IN(@KeyCol,@KeyCol2,@KeyCol3)
        BEGIN
            SET @SQL = @SQL + '
                insert into #T(keycol,keycol2,keycol3)  
                select DISTINCT KeyCol, KeyCol2, KeyCol3
                    from EditLog
                    where DbName = '''+@DbName+'''
                        and TbName = '''+@TbName+'''
                        and CAST(cast('''+@value+''' as  '+@ColType+') AS sql_variant) IN(KeyCol,KeyCol2,KeyCol3)
                    
            '    
        END
    end
    print @SQL 
    EXEC    SP_EXECUTESQL @SQL

    begin
            SET @SQL = '
            select    e.KeyCol,e.KeyCol2,e.KeyCol3,
                            CASE e.DoType WHEN 0 THEN ''新增'' WHEN 1 THEN ''修改'' WHEN 2 THEN ''删除'' END DoType, 
                            ISNULL(tc.descript,e.ColName)ColName,OldValue,NewValue,--e.DoUserID,
                            e.Douserid,e.CrtDate
                from EditLog e 
                    inner join #T t 
                        on e.keycol = t.keycol
                        '+ CASE WHEN @KeyCol2 is NOT NULL THEN 'AND e.keycol2 = t.keycol2 ' ELSE '' END 
                         + CASE WHEN @KeyCol3 is NOT NULL THEN 'AND e.keycol3 = t.keycol3 ' ELSE '' END 
                        +'
                        and e.DbName = '''+@DbName+'''
                        and e.TbName = '''+@TbName+'''
                    LEFT JOIN TbCol tc
                        on tc.TbID = '+@TbID+' 
                        AND tc.ColName = e.ColName    
                where e.CrtDate between @bgntime and @endtime
                '+CASE WHEN isnull(@DoType,-1) = -1 THEN '' ELSE ' and e.DoType = @Dotype ' end+'
                    ORDER BY e.KeyCol, e.CrtDate        
            '    
    end
    print @SQL
    EXEC    SP_EXECUTESQL @SQL,N'@bgntime datetime, @endtime datetime,@Dotype int',
                @bgntime = @bgntime,@endtime = @endtime,@Dotype = @Dotype
    DROP TABLE #T
END
GO
/*        
-- Author:      Master谭        
-- Create date:         
-- Description: 专用查询        
-- Memo: 

*/        
ALTER PROC VarLogQuery          
 @DbName varchar(50),        
 @TbName varchar(50),         
 @Item varchar(50),         
 @value varchar(50), 
 @bgntime datetime,        
 @endtime datetime,        
 @DoType int = -1--(0新增,2删除,1修改,-1不限)        
AS        
BEGIN        
 SET NOCOUNT ON;        
 CREATE TABLE #T(
    k1 sql_variant, k2 sql_variant, k3 sql_variant,DoType varchar(10) , 
    ColName varchar(10), Oldvalue sql_variant, NewValue sql_variant, 
    DoName varchar(50), CrtDate datetime)
    insert into #T
    exec LogQuery    
        @DbName  = @DbName,
        @TbName  = @TbName, 
        @Item  = @Item, 
        @value  = @value, 
        @bgntime  = @bgntime,
        @endtime  = @endtime,
        @DoType  = @DoType--(0新增,2删除,1修改,-1不限)
        SELECT * FROM #T
    IF @DbName  = 'Northwind' AND @TbName  = 'Customers'
    BEGIN
    ;with cet as
    (
        select CAST(k1 as nchar(10)) 客户ID, DoType 操作类型, ColName, DoName 操作人,
            ISNULL(CAST(Oldvalue AS VARCHAR(200)),'')     
            + ' --> ' 
            +    
            ISNULL(CAST(NewValue AS VARCHAR(200)),'') Value,
            CONVERT(varchar(19),crtdate,120 ) 操作时间
        FROM #T
    )    
    select    p.客户ID, p.操作类型, p.操作人, p.操作时间,
                    isnull(p.[公司],c.CompanyName) 公司,    
                    isnull(p.[姓名],c.ContactName) 姓名, 
                    isnull(p.[地址],c.Address) 地址,
                    isnull(p.[城市],c.City) 城市,
                    isnull(p.[邮编],c.PostalCode) 邮编,
                    isnull(p.[国家],c.Country) 国家,
                    isnull(p.[电话],c.Phone) 电话,
                    isnull(p.[传真],c.Fax) 传真                    
        FROM cet c pivot(MAX(Value) 
            for ColName in([公司],[姓名],[地址],[城市],[邮编],[国家],[电话],[传真]))p
        left join Northwind..Customers c
            on p.客户ID = c.CustomerID
    END    
END        
GO

 该例子中自动生成的触发器脚本

/*
USE [Northwind]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
-- Author:      DBA谭
-- Create date: 
-- Description:    
-- Memo:        
*/
CREATE TRIGGER trg_Customers ON [dbo].[Customers]                            
  for INSERT, UPDATE, DELETE                       
AS
BEGIN           
    if @@RowCount <= 0 Return                
    set nocount on
    declare @DelCnt int, @InsCnt int
    DECLARE @DoUserID int, @DoProc varchar(50)  --读取上下文信息
    EXEC dbo.GetDoInfo @DoUserID OUTPUT, @DoProc OUTPUT
    
    SELECT @DelCnt = COUNT(1) FROM deleted
    SELECT @InsCnt = COUNT(1) FROM inserted
    IF @DelCnt > 0 and @InsCnt > 0
    BEGIN 
    --插入修改日志     

        if UPDATE([CustomerID])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, [keycol], DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), 'Customers', i.[CustomerID], 1, 'CustomerID', d.[CustomerID], i.[CustomerID], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on  i.[CustomerID] = d.[CustomerID]
                     and  ISNULL(i.[CustomerID],0) <> ISNULL(d.[CustomerID],0)
        END

        if UPDATE([CompanyName])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, [keycol], DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), 'Customers', i.[CustomerID], 1, 'CompanyName', d.[CompanyName], i.[CompanyName], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on  i.[CustomerID] = d.[CustomerID]
                     and  ISNULL(i.[CompanyName],0) <> ISNULL(d.[CompanyName],0)
        END

        if UPDATE([ContactName])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, [keycol], DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), 'Customers', i.[CustomerID], 1, 'ContactName', d.[ContactName], i.[ContactName], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on  i.[CustomerID] = d.[CustomerID]
                     and  ISNULL(i.[ContactName],0) <> ISNULL(d.[ContactName],0)
        END

        if UPDATE([Address])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, [keycol], DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), 'Customers', i.[CustomerID], 1, 'Address', d.[Address], i.[Address], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on  i.[CustomerID] = d.[CustomerID]
                     and  ISNULL(i.[Address],0) <> ISNULL(d.[Address],0)
        END

        if UPDATE([City])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, [keycol], DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), 'Customers', i.[CustomerID], 1, 'City', d.[City], i.[City], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on  i.[CustomerID] = d.[CustomerID]
                     and  ISNULL(i.[City],0) <> ISNULL(d.[City],0)
        END

        if UPDATE([PostalCode])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, [keycol], DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), 'Customers', i.[CustomerID], 1, 'PostalCode', d.[PostalCode], i.[PostalCode], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on  i.[CustomerID] = d.[CustomerID]
                     and  ISNULL(i.[PostalCode],0) <> ISNULL(d.[PostalCode],0)
        END

        if UPDATE([Country])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, [keycol], DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), 'Customers', i.[CustomerID], 1, 'Country', d.[Country], i.[Country], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on  i.[CustomerID] = d.[CustomerID]
                     and  ISNULL(i.[Country],0) <> ISNULL(d.[Country],0)
        END

        if UPDATE([Phone])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, [keycol], DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), 'Customers', i.[CustomerID], 1, 'Phone', d.[Phone], i.[Phone], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on  i.[CustomerID] = d.[CustomerID]
                     and  ISNULL(i.[Phone],0) <> ISNULL(d.[Phone],0)
        END

        if UPDATE([Fax])
        BEGIN
            INSERT INTO dbo.EditLog(DbName,TbName, [keycol], DoType, ColName, OldValue, NewValue, DoWhere, DoUserID)
            SELECT Db_Name(), 'Customers', i.[CustomerID], 1, 'Fax', d.[Fax], i.[Fax], @DoProc, @DoUserID
                from inserted i 
                    inner join deleted d 
                        on  i.[CustomerID] = d.[CustomerID]
                     and  ISNULL(i.[Fax],0) <> ISNULL(d.[Fax],0)
        END
    END 
    ELSE IF @DelCnt = 0 and @InsCnt > 0    
    --插入新增日志   
    BEGIN
        INSERT INTO dbo.EditLog(DbName, TbName, [keycol], DoType, DoWhere, DoUserID)
        SELECT Db_Name(),'Customers', [CustomerID], 0, @DoProc, @DoUserID
            from inserted 
    END
    ELSE IF @DelCnt > 0 and @InsCnt = 0    
    --插入删除日志   
    BEGIN
        INSERT INTO dbo.EditLog(DbName, TbName, [keycol], DoType, DoWhere, DoUserID)
        SELECT Db_Name(), 'Customers', [CustomerID], 2, @DoProc, @DoUserID
            from deleted 
        INSERT INTO dbo.DelLog(DbName, TbName, DoWhere, DoUserID, Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11)
        SELECT Db_Name(), 'Customers', @DoProc, @DoUserID, [CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], [Country], [Phone], [Fax]
            from deleted 
    END
END
GO

insert into TbList(DbName,TbName, [keycol], Descript)
select Db_Name(), 'Customers', 'CustomerID', '客户表'

insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, 'CustomerID', '客户ID',1,'nchar(5)'
    FROM TbList WHERE DbName = Db_Name()    AND TbName = 'Customers'
insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, 'CompanyName', '公司',1,'nvarchar(40)'
    FROM TbList WHERE DbName = Db_Name()    AND TbName = 'Customers'
insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, 'ContactName', '姓名',1,'nvarchar(30)'
    FROM TbList WHERE DbName = Db_Name()    AND TbName = 'Customers'
insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, 'Address', '地址',1,'nvarchar(60)'
    FROM TbList WHERE DbName = Db_Name()    AND TbName = 'Customers'
insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, 'City', '城市',1,'nvarchar(15)'
    FROM TbList WHERE DbName = Db_Name()    AND TbName = 'Customers'
insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, 'PostalCode', '邮编',1,'nvarchar(10)'
    FROM TbList WHERE DbName = Db_Name()    AND TbName = 'Customers'
insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, 'Country', '国家',1,'nvarchar(15)'
    FROM TbList WHERE DbName = Db_Name()    AND TbName = 'Customers'
insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, 'Phone', '电话',1,'nvarchar(24)'
    FROM TbList WHERE DbName = Db_Name()    AND TbName = 'Customers'
insert into TbCol(TbID, ColName, Descript, IsFilter,ColType)
    select TbID, 'Fax', '传真',1,'nvarchar(24)'
    FROM TbList WHERE DbName = Db_Name()    AND TbName = 'Customers'

*/

 

 

 

 

 

posted on 2014-04-21 10:29  磊仔  阅读(1593)  评论(0编辑  收藏  举报