当前位置: 代码迷 >> Sql Server >> 怎么知道表被修改、删除、新增, 小弟我想捕获这些事件去完成别的动作
  详细解决方案

怎么知道表被修改、删除、新增, 小弟我想捕获这些事件去完成别的动作

热度:69   发布时间:2016-04-24 10:28:21.0
如何知道表被修改、删除、新增, 我想捕获这些事件去完成别的动作!
提出这个问题是事出有因: 前些日子,把一些SQL语句(对表升级的)给客户对两个数据库自行升级, 但客户搞忘了,只升级了A库,忘记升级B库了。 结果就出了问题,客户就把责任推给我,说我当时没写清楚。

出了问题,就要长记心。 就想“只升级A库,由一个内部机制进行触发升级B库” 这样一来,就可以达到AB两库数据结构相同。

所以问题来了, 执行SQL后,如何知道A库哪个表变动了,且改动了哪些东西呢?
------解决方案--------------------
用触发器来搞升级,死定。还不如做好管理
------解决方案--------------------
楼主需要的是去楼下小卖部买本本子,写下升级注意事项,每次升级时候按照事项一步步来,做完打钩,保管比触发器好用
------解决方案--------------------


-- 供楼主参考. 不建议采用这种方案。
-- 建议楼主 和客户沟通好,升级说明的再详细一点.. 

  
CREATE TABLE [dbo].[DatabaseLog](
[LogID] [bigint] IDENTITY(1,1) NOT NULL,
[ServerName] [nvarchar](200) NOT NULL,
[LoginName] [sysname] NOT NULL,
[DBUser] [sysname] NOT NULL,
[DBName] [nvarchar](100) NULL,
[EventType] [sysname] NULL,
[ObjectType] [sysname] NULL,
[Schema] [sysname] NULL,
[Object] [sysname] NULL,
[TSQL] [nvarchar](max) NOT NULL,
[XmlEvent] [xml] NOT NULL,
[PostTime] [datetime] NOT NULL,
[CreateTime] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED 
(
[LogID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TRIGGER [trg_ServiceEventLog] 
ON ALL SERVER   --或者服务器级别 ALL SERVER  .数据库:DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS  --或者服务器级别:DDL_SERVER_LEVEL_EVENTS  .数据库级别:DDL_DATABASE_LEVEL_EVENTS
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @data XML;
    
    SET @data = EVENTDATA();
--PRINT CONVERT(NVARCHAR(max),@data)
    INSERT INTO ServerLog.[dbo].[DatabaseLog] ([ServerName],[LoginName],[DBUser]
    ,[DBName],[EventType],[ObjectType],[Schema],[Object],[TSQL],[XmlEvent],CreateTime,[PostTime])
    VALUES 
        (
        
        @data.value('(/EVENT_INSTANCE/ServerName)[1]', 'nvarchar(200)'),
        @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'),  
        @data.value('(/EVENT_INSTANCE/UserName)[1]', 'sysname'),
        @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)'), 
        @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname'),
        @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'sysname'),  
        @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname'), 
        @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'), 
        @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'), 
        @data,
        @data.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime'),
        GETDATE()
        
        );
END;
GO





------解决方案--------------------
可以第三方数据库结构对比工具对比一下,查询看做了哪些改动,可生成T-SQL语句
(数据库结构对比)SQL Compare 8
(数据库数据对比)SQL Data Compare 8
软件下载地址:
http://pan.baidu.com/s/1pJAvET9
------解决方案--------------------
用触发器吧。。。不过最好是分开升级,不然后果很严重。
------解决方案--------------------
可以用DDL触发器,自动记录所有DDL语句(如表结构修改指令),
然后到另一边的数据库执行..

但是,用DDL触发器也许无法保证100%的同步没问题,建议部署时还是手工执行同步,比较放心.
------解决方案--------------------
 我觉得还是不要用触发器
这玩意还是一步一步手工来
触发器可以做个LOG
  相关解决方案