- 浏览: 125045 次
- 性别:
- 来自: 北京
最新评论
有两个服务器,分别装有两个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
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
发表评论
-
orcale备份,还原数据库
2014-02-26 11:29 539在cmd下边输入 exp 数据库名/密码@数据库服务 file ... -
sqlserver数据库自动备份
2014-02-20 16:50 556DECLARE @strPath NVARCHAR(200) ... -
SQL两个数据库 触发器(转)
2014-02-19 12:54 536有两个服务器,分别装有两个SQL Server A ,B A ... -
设置主外建
2013-12-18 15:58 561主键 alter table XXX add constrai ... -
oracle死锁
2013-09-01 14:12 590select /*+ NO_MERGE(a) NO_MERGE ... -
pl/sql 无法解析指定的连接标识符(转载)
2013-04-22 16:23 955机器中安装了Oracle9i的完整服务器端,并且同时还安装了 ... -
oracle时间字段
2013-03-11 09:23 7331 select to_char(sysdate,'yyyy ... -
使用ssh连接操作oracle数据库
2013-03-05 09:43 4191su - oraclesqlplus /nologconn ... -
各种数据库对应的jar包(转载)
2013-02-01 15:12 948具体如下: 数据库类型 对应的Jar ... -
oracle中varchar2转换成clob(转载)
2012-12-14 15:29 1099alter table Shop add texts clob ... -
oracle 游标
2012-09-20 18:03 738看一下数据库的游标数参数 show parameter ... -
mysql卸载后注册表删除
2012-08-28 09:42 2341当你要升级mysql版本,或者重新安装mysql数据库时,my ... -
Mysql本地计算机无法启动错误1067:进程意外终止的问题 (转载)
2012-08-06 09:49 798Mysql 本地计算机无法启动错误 1067:进程意外终止的问 ... -
SQLSERVER系统表(转载)
2012-07-04 09:02 26191、查看表和试图 SELECT * FROM sys.obj ... -
将ORACLE数据库表中字段的varchar类型转为CLOB?
2012-04-25 11:38 984怎么样将ORACLE数据库表中字段的varchar类型转为 ... -
给一个用户创建表的权限
2012-04-12 17:00 811要能执行建表语句,需要两个权限:1. create table ... -
ORA-28000: the account is locked-的解决办法 (转载)
2012-04-11 09:58 734ORA-28000: the account is loc ... -
SQL Server 2005还原数据库时出现“备份集中的数据库备份与现有的数据库不同”解决方法 (转载)
2012-03-06 16:06 1194对于SQL Server 2005,有几个地方是要注意的,比如 ... -
oracle grant权限
2012-02-21 15:42 1208oracle的权限管理 ... -
java.util.date转化成java.sql.date
2012-02-15 14:28 801java.util.Date curDate = new ja ...
相关推荐
SQL数据库触发器的实际应用 触发器是一种特殊类型的存储过程,不由用户直接调用。当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或DELETE。触发器可以查询其它表,...
【SQL数据库触发器详解】 SQL数据库中的触发器是一种特殊的存储过程,它的主要功能是在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行,以此来维护数据的完整性和一致性。触发器的设计旨在增强数据库...
SQLServer2005数据库触发器是数据库管理系统中一种特殊类型的存储过程,它不直接由用户调用,而是在特定的数据库操作(如插入、更新或删除)发生时自动执行。这种机制使得触发器成为实现复杂数据库完整性约束的有效...
【SQL Server 2000数据库触发器的应用】 SQL Server 2000中的数据库触发器是一种特殊类型的存储过程,它在数据操作语言(DML)的Insert、Delete和Update语句执行时自动触发,从而扩展了数据库系统的功能。触发器与...
数据库触发器是数据库管理系统中的一种重要机制,它允许在特定的数据操作语言(DML)事件发生时自动执行一段预定义的SQL代码。本实验报告主要围绕如何理解和运用触发器,特别是针对数据完整性的维护,以及在...
### 数据库_SQL触发器实例讲解 #### 一、触发器概念与分类 ...通过以上实例,我们不仅了解了触发器的基本概念和分类,还掌握了其实现的具体方法,这对于理解和运用数据库触发器有着重要的指导意义。
在SQL Server中,每个触发器都会涉及两个临时表`INSERTED`和`DELETED`,它们记录了数据变化前后的情况,方便我们在触发器中进行比较和处理。 实验内容涵盖了多种存储过程和触发器的使用场景,比如添加新记录、查询...
SQL Server 2005中的触发器分为两种类型: 1. DML触发器:包括AFTER和INSTEAD OF触发器,它们在INSERT、UPDATE或DELETE语句执行后或执行前触发。AFTER触发器在操作完成后执行,用于验证数据的完整性;INSTEAD OF...
数据库触发器是数据库管理系统中的一种重要机制,它们本质上是预定义的存储过程,可以在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行。SQL Server提供了对触发器的支持,允许用户根据需要创建和定制...
触发器可以比较这两个表来确定哪些列被修改,以及如何响应这些变化。通过使用IF UPDATE语句,可以针对特定列的更新定义触发器的行为,比如只对特定列的修改作出反应。 3. **DELETE触发器**: DELETE触发器在删除...
MS SQL SERVER数据库触发器技术的实际应用 本文将讨论MS SQL SERVER数据库触发器技术的实际应用,涵盖触发器技术的基本概念、特点和实际应用场景。 首先,让我们了解什么是触发器。触发器是一种特殊的存储过程,它...
### 数据库触发器详解 #### 引言 在数据库管理系统(DBMS)中,触发器是一种特殊类型的存储过程,被设计成在预定义的数据库事件发生时自动执行。这些事件包括但不限于INSERT、UPDATE、DELETE等数据操作语言(DML)事件...
### SQL对比两个数据库之间的差异 #### 核心概念理解 1. **信息模式表(Information Schema)**:MySQL中的信息模式表是一个虚拟的只读表集合,用于存储关于所有数据库对象的元数据,包括表、视图、存储过程等。 2...
"数据库触发器的创建和使用" 数据库触发器是数据库管理系统中的一种特殊类型的存储过程,它可以自动执行某些操作来确保数据的完整性和一致性。本章节将详细介绍触发器的概念、功能、优点、类型,以及如何创建和使用...
每次触发器被激活,系统会自动创建两个临时表: 1. **inserted表**:存储了所有由INSERT或UPDATE操作新插入的行,对于DELETE操作,它是空的或包含被删除的行的副本。 2. **deleted表**:存储了所有由DELETE操作删除...
这两个表在触发器执行过程中被数据库系统自动创建,用来存储与被触发事件相关的数据行。deleted表存放被删除的数据行,inserted表存放被插入的数据行或被更新的数据行的更新前的备份。 触发器的优点: 1. 自动性:...
通过深入了解和正确使用SQL Server数据库触发器,你可以更好地管理和保护你的数据,确保其符合业务需求和数据完整性标准。在实践中,结合标签中的"DBA"角色,数据库管理员应熟练掌握触发器的运用,以便在日常维护和...
数据库触发器是SQL Server数据库管理系统中的一个重要特性,它允许开发者在特定的数据操作(如INSERT、UPDATE或DELETE)之前或之后自动执行一段预定义的代码。触发器的主要目标是增强数据库的完整性,确保数据的一致...
【SQL Server数据库触发器与存储过程技术在自定义数据表中的应用】 SQL Server数据库是微软公司开发的一款广泛应用的客户端/服务器(C/S)架构的数据库管理系统,以其强大的性能和丰富的数据管理功能著称。在数据库...