提出这个问题是事出有因: 前些日子,把一些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