`
京华倦客
  • 浏览: 119250 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL两个数据库 触发器(转)

阅读更多
有两个服务器,分别装有两个SQL Server A ,B
A,B的表结构a,b 相同
A,B分别都会做一些INSERT,UPDATE,DELETE操作,要求AB的数据保持一致
(即A新增一条数据,要求B也新增,A更改一条数据,B也更改相应的)
是不是可以用触发器来实现
那位高手给个例程  
/*
作者:邹建
*/

/*--同步两个数据库的示例

有数据
srv1.库名..author有字段:id,name,phone,
srv2.库名..author有字段:id,name,telphone,adress

要求:
srv1.库名..author增加记录则srv1.库名..author记录增加
srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新
--*/

--大致的处理步骤
--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步
exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip'
exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码'
go

--2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动
我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动
go


--3.实现同步处理

--a.在srv1..author中创建触发器,实现数据即时同步
--新增同步
create trigger tr_insert_author on author
for insert
as
set xact_abort on
insert srv2.库名.dbo.author(id,name,telphone)
select id,name,telphone from inserted
go

--修改同步
create trigger tr_update_author on author
for update
as
set xact_abort on
update b set name=i.name,telphone=i.telphone
from srv2.库名.dbo.author b,inserted i
where b.id=i.id
go

--删除同步
create trigger tr_delete_author on author
for delete
as
set xact_abort on
delete b
from srv2.库名.dbo.author b,deleted d
where b.id=d.id
go



--3.实现同步处理的方法2,定时同步

--在srv1中创建如下的同步处理存储过程
create proc p_process
as
--更新修改过的数据
update b set name=i.name,telphone=i.telphone
from srv2.库名.dbo.author b,author i
where b.id=i.id and
(b.name<>i.name or b.telphone<>i.telphone)

--插入新增的数据
insert srv2.库名.dbo.author(id,name,telphone)
select id,name,telphone from author i
where not exists(
select * from srv2.库名.dbo.author where id=i.id)

--删除已经删除的数据(如果需要的话)
delete b
from srv2.库名.dbo.author b
where not exists(
select * from author where id=b.id)
go



--然后创建一个作业定时调用上面的同步处理存储过程就行了

企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句: exec p_process
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.



上面写了两种同步方法,实际使用时,只需要其中任意一种就行了

如果数据库在同一实例中,则只需要同步处理的部分,并且将处理语句中涉及到的服务器名去掉,即只要:

库名.dbo.表名  



如果只是简单的数据同步,可以用触发器来实现.下面是例子:

--测试环境:SQL2000,远程主机名:xz,用户名:sa,密码:无,数据库名:test

--创建测试表,不能用标识列做主键,因为不能进行正常更新
--在本机上创建测试表,远程主机上也要做同样的建表操作,只是不写触发器
if exists (select * from dbo.sysobjects where id = object_id(N'[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [test]

create table test(id int not null constraint PK_test primary key
,name varchar(10))
go

--创建同步的触发器
create trigger t_test on test
for insert,update,delete
as
set XACT_ABORT on
--启动远程服务器的MSDTC服务
exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output

--启动本机的MSDTC服务
exec master..xp_cmdshell 'net start msdtc',no_output

--进行分布事务处理,如果表用标识列做主键,用下面的方法
BEGIN DISTRIBUTED TRANSACTION
delete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)
where id in(select id from deleted)
insert into openrowset('sqloledb','xz';'sa';'',test.dbo.test)
select * from inserted
commit tran
go
分享到:
评论

相关推荐

    SQL Server数据库实验_存储过程与触发器设计.docx

    SQL SERVER为每个触发器都创建了两个临时表INSERTED表和DELETED表,这两个表的逻辑结构与被触发器作用的表一样,用户可以读取这两个表的内容,但不能对它们进行修改,触发器执行完后,这两个表也会自动删除。...

    数据库触发器是一种存储过程

    触发器是一种特殊的存储过程,类似于其它编程语言中的事件函数,SQL Server™ 允许为 INSERT、UPDATE、DELETE 创建触发器,当在表(视图)中插入、更新、删除记录时,触发一个或一系列 T-SQL 语句。 触发器分为两种...

    在SQLServer2008中存储过程和触发器是两个重要的数据库对象.pdf

    在SQLServer2008中存储过程和触发器是两个重要的数据库对象.pdf

    两个数据库比较(SQLServer版)

    * 名称:两个SQLServer数据库比较 * 用途:比较数据库内对象(表、视图、函数、存储过程、触发器、约束等)、字段(数据类型及长度) * 假设:库CNFM1与CFR1是一个项目不同时期的版本数据库,由于整合的需要,那么...

    数据库之—用触发器实现每个学生最多只能选择3门课程

    用触发器实现每个学生最多只能选择3门课程的代码如下: use 学生档案 go create trigger elective_restrict on 选课表 for insert, update as begin if update (课程号) begin declare @num varchar(10) declare...

    sqlserver触发器例子

    二﹕ SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成后﹐与该...

    利用SQL Server触发器实现表的历史修改痕迹记录

    本文以SQL Server 2005数据库中的触发器为例(因为手中的项目用的就是这个数据库) 先简单描述一下SQL Server触发器。 SQL Server触发器的inserted和deleted SQL Server为每个触发器都创建了两个专用虚拟表:...

    神通数据库-数据库快速入门.pdf

    神通数据库触发器按照所触发动作的间隔尺寸可以分为语句级触发器和行 级触发器。触发器由 CREATE TRIGGER 语句定义,FOR EACH 子句定义了触发动作的间隔尺寸,它既 可以是 FOR EACH STATEMENT(语句级触发器),也...

    SQL触发器使用实例

    重要: 这两个系统表的结构同插入数据的表的结构。 */ IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME = 'T_INSERT_卷烟库存表') DROP TRIGGER T_INSERT_卷烟库存表 GO CREATE TRIGGER T_...

    SQL Server用触发器强制执行业务规则

    Microsoft:registered: SQL Server:trade_mark: 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发 器以...

    数据库比较工具(比较两个数据库的差异,含:表、字段字段长度等)

    本工具用于对比SQL数据库,以源数据库为标准 数据库, 然后拿目标数据库与标准数据库比较,如果目标数 据库少 了表,或少了字段,或字段类型长度不一样,或索引 不一样, 或存储过程,视图,触发器,默认值等不一样,就产生 ...

    sql数据库比较工具 3.5 官方版

    2、快速的比较两个库之间表、视图、存储过程、函数和触发器的不同,并可以生成SQL脚本,执行SQL脚本就可以完成两个库的同步操作 3、增加大字段(TEXT)的查看和修改功能 4、统计库中所有表的记录数,分析各表的数据 ...

    数据库编程期末答疑,卷子讲解,SQL server相关操作讲解,如有侵权请联系删除

    如下是一个简化的员工考勤应用E-R图,请在SQL Server中创建名为YQKG的数据库,包括两个数据文件,一个日志文件,文件名按SQL Server对象命名规范定义,数据文件按10%的比例增长,数据库定义完成后输入如下样本数据。...

    SqlServer数据库课程设计-订单管理

    这是使用Microsoft Sql Server数据库实现的订单管理课程作业,包含数据库脚本、数据库文件、要求及文档。 本资源中实现的数据库表有订单信息表、客户信息表、送货记录表,文档列...7.至少两个索引 8.定义触发器(可选)

    数据库触发器DB2和SqlServer有哪些区别

    大部分数据库语句的基本语法是相同的,但具体到的每一种数据库,又有些不一样,例如触发器,DB2和SQL Server两种很大的不同。 例如DB2的一个触发器: CREATE TRIGGER EAS.trName NO CASCADE BEFORE insert //插入...

    SQL 比较数据库差异

    SQL 比较数据库差异 表,视图,存储过程,用户自定义函数,触发器

    达梦数据库_SQL语言手册

    达梦数据库_SQL语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子...

    HeidiSQL超好用的MySQL图形化管理工具 2019最新版

    HeidiSQL是一款用于简单化迷你的服务器和数据库管理的图形化界面,采用Delphi开发,支持MySQL、...此外,你可以从文本文件导入数据,运行SQL查询,在两个数据库之间同步表以及导出选择的表到其它数据库或者SQL脚本中。

    Sql Server触发器的使用

    Sql Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护,它们存在于内存中而不是数据库中。这两个表的结构总是与被该触发器作用的表的结构相同,触发器执行完成后,与该触发器...

    SQL Server触发器及触发器中的事务学习

    在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器 & DDL触发器)和After触发器 & Instead Of 触发器的应用不同,开始说起它们,然后是说与事务有关的故事。如果,你有什么...

Global site tag (gtag.js) - Google Analytics