`
京华倦客
  • 浏览: 124019 次
  • 性别: 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数据库触发器 SQL数据库触发器

    SQL数据库触发器的实际应用 触发器是一种特殊类型的存储过程,不由用户直接调用。当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或DELETE。触发器可以查询其它表,...

    SQL数据库 触发器课件

    【SQL数据库触发器详解】 SQL数据库中的触发器是一种特殊的存储过程,它的主要功能是在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行,以此来维护数据的完整性和一致性。触发器的设计旨在增强数据库...

    SQLServer2005数据库触发器应用

    SQLServer2005数据库触发器是数据库管理系统中一种特殊类型的存储过程,它不直接由用户调用,而是在特定的数据库操作(如插入、更新或删除)发生时自动执行。这种机制使得触发器成为实现复杂数据库完整性约束的有效...

    SQL Server 2000数据库触发器的应用.pdf

    【SQL Server 2000数据库触发器的应用】 SQL Server 2000中的数据库触发器是一种特殊类型的存储过程,它在数据操作语言(DML)的Insert、Delete和Update语句执行时自动触发,从而扩展了数据库系统的功能。触发器与...

    数据库的触发器实验报告书

    数据库触发器是数据库管理系统中的一种重要机制,它允许在特定的数据操作语言(DML)事件发生时自动执行一段预定义的SQL代码。本实验报告主要围绕如何理解和运用触发器,特别是针对数据完整性的维护,以及在...

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

    在SQL Server中,每个触发器都会涉及两个临时表`INSERTED`和`DELETED`,它们记录了数据变化前后的情况,方便我们在触发器中进行比较和处理。 实验内容涵盖了多种存储过程和触发器的使用场景,比如添加新记录、查询...

    基于sql server 2005的触发器的创建及操作

    SQL Server 2005中的触发器分为两种类型: 1. DML触发器:包括AFTER和INSTEAD OF触发器,它们在INSERT、UPDATE或DELETE语句执行后或执行前触发。AFTER触发器在操作完成后执行,用于验证数据的完整性;INSTEAD OF...

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

    数据库触发器是数据库管理系统中的一种重要机制,它们本质上是预定义的存储过程,可以在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行。SQL Server提供了对触发器的支持,允许用户根据需要创建和定制...

    SQL Server数据库中使用触发器经验谈

    触发器可以比较这两个表来确定哪些列被修改,以及如何响应这些变化。通过使用IF UPDATE语句,可以针对特定列的更新定义触发器的行为,比如只对特定列的修改作出反应。 3. **DELETE触发器**: DELETE触发器在删除...

    MS SQL SERVER数据库触发器技术的实际应用.pdf

    MS SQL SERVER数据库触发器技术的实际应用 本文将讨论MS SQL SERVER数据库触发器技术的实际应用,涵盖触发器技术的基本概念、特点和实际应用场景。 首先,让我们了解什么是触发器。触发器是一种特殊的存储过程,它...

    数据库触发器介绍

    ### 数据库触发器详解 #### 引言 在数据库管理系统(DBMS)中,触发器是一种特殊类型的存储过程,被设计成在预定义的数据库事件发生时自动执行。这些事件包括但不限于INSERT、UPDATE、DELETE等数据操作语言(DML)事件...

    sql对比两个数据库之间的差异

    ### SQL对比两个数据库之间的差异 #### 核心概念理解 1. **信息模式表(Information Schema)**:MySQL中的信息模式表是一个虚拟的只读表集合,用于存储关于所有数据库对象的元数据,包括表、视图、存储过程等。 2...

    数据库的触发器的创建和使用

    "数据库触发器的创建和使用" 数据库触发器是数据库管理系统中的一种特殊类型的存储过程,它可以自动执行某些操作来确保数据的完整性和一致性。本章节将详细介绍触发器的概念、功能、优点、类型,以及如何创建和使用...

    数据库学习中的触发器

    每次触发器被激活,系统会自动创建两个临时表: 1. **inserted表**:存储了所有由INSERT或UPDATE操作新插入的行,对于DELETE操作,它是空的或包含被删除的行的副本。 2. **deleted表**:存储了所有由DELETE操作删除...

    SQL Server数据库中触发器的应用研究.pdf

    这两个表在触发器执行过程中被数据库系统自动创建,用来存储与被触发事件相关的数据行。deleted表存放被删除的数据行,inserted表存放被插入的数据行或被更新的数据行的更新前的备份。 触发器的优点: 1. 自动性:...

    SQL Server数据库触发器概述

    通过深入了解和正确使用SQL Server数据库触发器,你可以更好地管理和保护你的数据,确保其符合业务需求和数据完整性标准。在实践中,结合标签中的"DBA"角色,数据库管理员应熟练掌握触发器的运用,以便在日常维护和...

    数据库触发器.docx

    数据库触发器是SQL Server数据库管理系统中的一个重要特性,它允许开发者在特定的数据操作(如INSERT、UPDATE或DELETE)之前或之后自动执行一段预定义的代码。触发器的主要目标是增强数据库的完整性,确保数据的一致...

    SQL Server数据库触发器与存储过程技术在自定义数据表中的应用.pdf

    【SQL Server数据库触发器与存储过程技术在自定义数据表中的应用】 SQL Server数据库是微软公司开发的一款广泛应用的客户端/服务器(C/S)架构的数据库管理系统,以其强大的性能和丰富的数据管理功能著称。在数据库...

Global site tag (gtag.js) - Google Analytics