两个数据库表数据实时同步(sql2008 触发器)

合集下载

sqlserver2008触发器

sqlserver2008触发器

初学sql server 2008之触发器触发器(trigger):是一种特殊的存储过程,可以用来对表实施复杂的完整性约束,保持数据的一致性。

当触发器所保护的数据发生改变时,触发器会自动被激活,并执行触发器中所定义的相关操作,从而保证对数据的不完整性约束或不正确的修改。

在SQL SERVER 2008中,有三种类型的触发器:(1)DML触发器:是指触发器在数据库中发生数据操作语言(DML)事件时将启用。

DML事件即指在表或视图中修改数据的insert、update、delete语句也。

(2)DDL触发器:是指当服务器或数据库中发生数据定义语言(DDL)事件时将启用。

DDL事件即指在表或索引中的create、alter、drop语句也。

(3)登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发。

不过根据DML触发器触发的方式不同又分为以下两种情况:(1)AFTER触发器:它是在执行INSERT、UPDATE、DELETE语句操作之后执行触发器操作。

它主要是用于记录变更后的处理或检查,一旦发生错误,可以用Rollback Transaction语句来回滚本次扣件,不过不能对视图定义AFTER触发器。

(2)INSTEAD OF触发器:它在执行INSERT、UPDATE、DELETE语句操作之前执行触发器本身所定义的操作。

而INSTEAD OF触发器是可以定义在视图上的。

在SQL SERVER 2008中,DML触发器的实现使用两个逻辑表DELETED和INSERTED。

这两个表是建立在数据库服务器的内存中,由系统管理的逻辑表,我们对于它只有只读的权限。

DELETED和INSERED表的结构和触发器所在的数据表的结构是一样的。

当触发器执行完成后,它们也就会被自动删除。

INSERED表用于存放你在操件insert、update、delete语句后,更新的记录。

比如你插入一条数据,那么就会把这条记录插入到INSERTED表。

SQLServer(2008)中通过触发器进行数据同步的设置说明

SQLServer(2008)中通过触发器进行数据同步的设置说明

SQLServer(2008)中通过触发器进行数据同步的设置说明根据公司领导要求,为了减轻数据库服务器上的压力。

特将其中一部分数据分离出来,放到另外一台数据库服务器上。

因此需要对基础数据进行一个同步操作。

要进行数据同步,可以通过代码、触发器、日志复制等。

因为此处涉及到的数据量不大,且不方便修改程序代码。

所有采取的是Sql Server中触发器的一个同步。

下面就对触发器进行数据同步的一些配置做下说明:环境:Sql Server 2008Windows Server 20081.确定两台数据库服务器上要进行同步的数据库及表结构2.在作为数据源的数据库服务器上对应的表上创建触发器:(204.17是数据源服务器,201.17是要同步的服务器)例子中的触发器的作用是将102.1.204.17服务器上test数据库中user表中的数据同步到201.17上的表中去(触发条件是任何添加、修改、删除操作)。

3.启动两台服务器上的Distributed Transaction Coordinator服务(开始--运行--services.msc 回车,找到前面的这个服务--启动)4.MSDTCMSDTC设置windows server 2003设置:windows server 2008设置:5.检查防火墙。

可以关闭防火墙或把MSDTC加入例外。

6.检查两台服务器通信是否正常:a) telnet DbIP 135是否可以通;b) 然后相互Ping IP;c) 再ping 相互的NetBios名称(输入ping -a ip就可以看到对应的NetBios名称),还不通的话d) 可以修改%windir%/system32/etc/hosts,或%windir%/system32/etc/lmhost.sam去掉文件扩展名,进行DB 服务和IP的绑定即可,如下图所示:到这里通过触发器进行数据库分布式开发的环境就准备好了。

SQL SERVER 2008数据库同步复制

SQL SERVER 2008数据库同步复制

SQL Server 2008数据库复制实现数据库同步备份SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份。

这里的同步备份指的是备份服务器与主服务器进行实时数据同步,正常情况下只使用主数据库服务器,备份服务器只在主服务器出现故障时投入使用。

它是一种优于文件备份的数据库备份解决方案。

在选择数据库同步备份解决方案时,我们评估了两种方式:SQL Server 2008的数据库镜像和SQL Server 2008数据库复制。

数据库镜像的优点是系统能自动发现主服务器故障,并且自动切换至镜像服务器。

但缺点是配置复杂,镜像数据库中的数据不可见(在SQL Server Management Studio中,只能看到镜像数据库处于镜像状态,无法进行任何数据库操作,最简单的查询也不行。

想眼见为实,看看镜像数据库中的数据是否正确都不行。

只有将镜像数据库切换主数据库才可见)。

如果你要使用数据库镜像,强烈推荐killkill写的SQL Server 2005 镜像构建手册,我们就是按照这篇文章完成了数据库镜像部署测试。

最终,我们选择了SQL Server 2008数据库复制。

下面通过一个示例和大家一起学习一下如何部署SQL Server 2008数据库复制。

测试环境:Windows Server 2008 R2 + SQL Server 2008 R2(英文版),两台服务器,一台主数据库服务器CNBlogsDB1,一台备份数据库服务器CNBlogsDB2。

复制原理:我们采用的是基于快照的事务复制。

主数据库服务器生成快照,备份库服务器读取并加载该快照,然后不停地从主数据库服务器复制事务日志。

见下图:图片来自SQL Server联机丛书安装与配置步骤:一、在两台服务器上安装好SQL Server 2008 R2,主要安装的组件:Database Engine(含SQL Server Replication),Management Tools。

SQL 两张表同步数据

SQL 两张表同步数据

在SQL中如何实现不同数据库的两张表的同步你可以分三个来写,分别用来监视insert\delete\update三个(这样写容易完成),我下面写一个,你其它有可以参照下面这个来写--插入行的情况CREATE TRIGGER [填入触发器名] ON [dbo].[表名]FOR INSERTASinsert [另外一个数据库名].[dbo].[表名] select * from inserted你也可以参照料我下面这段,写在一起,但比较麻烦,我就不具体按你要求的写了罗. CREATE trigger [数据库A.tr_user] on [user]/* 触发器在数据库A的user表建立一个名字tr_user的触发器*/for update,insert,delete/*监视修改插入删除*/asif not exists (select * from deleted)/* 如果deleted表为空,那么*/insert 数据库 B..[user](username,userpass,landtime) select username,password,lastlogin from inserted/* 将inserted表(就是对于触发器来说刚刚被插入的集合)插入到er */else if not exists (select * from inserted)--删除/* 否则如果inserted集合为空*/delete 数据库B..[user] where id in (select userid from deleted)/* 那么删除er下id是deleted集合中出现的id 这里用了in */else--更新update [user]set[user].username=ername,[user].userpass=i.passwordfrom 数据库B..[user] as [user],inserted as iwhere [user].id=erid/* update就很明显了,凡是updated的都来更新,保持一样就可以了*/alter table 数据库B..[user] ENABLE TRIGGER [数据库B.tr_user]在SQL中如何实现不同数据库的两张表的同步直接可以用了,不过这里我假设主键是idCREATE TRIGGER tr1ON DB_01.dbo.PAFOR INSERTASBEGINinsert into DB_02.dbo.PA select * from Inserted i ENDCREATE TRIGGER tr2ON DB_01.dbo.PAFOR deleteASBEGINdelete DB_02.dbo.PAfrom DB_02.dbo.PA,deletedwhere DB_02.dbo.PA.id=deleted.idENDCREATE TRIGGER tr3ON DB_01.dbo.PAFOR updateASBEGINdelete DB_02.dbo.PAfrom DB_02.dbo.PA,deletedwhere DB_02.dbo.PA.id=deleted.idinsert into DB_02.dbo.PA select i.* from inserted i ENDCREATE TRIGGER tr4ON DB_02.dbo.PAFOR INSERTASBEGINinsert into DB_01.dbo.PA select * from Inserted iENDCREATE TRIGGER tr5ON DB_02.dbo.PAFOR deleteASBEGINdelete DB_01.dbo.PAfrom DB_01.dbo.PA,deletedwhere DB_01.dbo.PA.id=deleted.idENDCREATE TRIGGER tr6ON DB_02.dbo.PAFOR updateASBEGINdelete DB_01.dbo.PAfrom DB_01.dbo.PA,deletedwhere DB_01.dbo.PA.id=deleted.idinsert into DB_01.dbo.PA select i.* from inserted i END。

sql2008触发器语句

sql2008触发器语句

sql2008触发器语句摘要:1.SQL Server 2008 简介2.触发器的概念与作用3.SQL Server 2008 触发器语句的基本结构4.触发器语句的类型与应用场景5.触发器语句的示例与实践正文:【1.SQL Server 2008 简介】SQL Server 2008 是微软推出的一款关系型数据库管理系统,它提供了强大的数据存储、查询和处理功能,被广泛应用于企业级数据解决方案中。

【2.触发器的概念与作用】触发器(Trigger)是一种在对表执行某些操作(如插入、更新或删除数据)时自动执行的存储过程。

触发器可以帮助维护数据的完整性和一致性,简化应用程序的开发和维护。

【3.SQL Server 2008 触发器语句的基本结构】在SQL Server 2008 中,触发器语句的基本结构如下:```CREATE TRIGGER trigger_nameON table_nameFOR EVENT typeASBEGIN-- 触发器执行的操作END;```其中,`trigger_name`是触发器的名称,`table_name`是触发器所关联的表名,`type`表示触发器要监听的事件类型,如INSERT、UPDATE 或DELETE。

【4.触发器语句的类型与应用场景】根据触发器执行的操作不同,可以将触发器分为三类:1.INSERT 触发器:在向表中插入新数据时执行。

应用场景包括:数据验证、数据分页、数据备份等。

2.UPDATE 触发器:在更新表中数据时执行。

应用场景包括:数据验证、数据审计、数据同步等。

3.DELETE 触发器:在删除表中数据时执行。

应用场景包括:数据备份、数据审计、数据同步等。

【5.触发器语句的示例与实践】假设有一个名为`orders`的表,包含以下字段:`order_id`(订单编号)、`order_date`(订单日期)和`total_amount`(订单总金额)。

现在需要创建一个触发器,在向该表插入新数据时,计算订单总金额并与1000 进行比较,如果大于1000 则将订单日期更新为当前日期。

两个oracle数据库间通过数据库链接和触发器同步两个数据库间数据

两个oracle数据库间通过数据库链接和触发器同步两个数据库间数据

两个oracle数据库间通过数据库链接和触发器同步两个数据库间数据为什么80%的码农都做不了架构师?>>>前提:本地数据库存在一张:A_TEST表,服务器数据库有两张表:A_TEST、A_TEST_HIST(历史表),需要将本地数据的更改、新增、删除同步到服务器数据库的两张表中。

方法一:通过触发器同步。

1、用如下命令建立DB Link:create database link MYTEST connect to XXXX identified by 'XXXX' using 'IP/Service Name(我的是:orcl)';注意:需要DB支持Advanced replication功能,是否支持,可用如下SQL查看:select * from v$option where PARAMETER='Advanced replic ation';如果是返回True就表示支持。

2、建立触发器:sendToCeShiTestcreate or replace trigger sendToCeShiTestafter insert or update or deleteon A_TESTfor each rowdeclare cunt integer:=0;--PRAGMA AUTONOMOUS_TRANSACTION; --自治事务解决触发器导致"ORA-04091:触发器/函数不能读它"不可行的验证begincasewhen updating thenSELECT count(*) INTO cunt FROM A_TEST@MYTEST t WHERE t.A_TEST_ID=:old.A_TEST_ID;IF cunt>0 THEN --当服务器数据库存在该条数据记录,只做更新,同时将原数据记录到历史表。

两个数据库表数据实时同步(sql2008 触发器)

两个数据库表数据实时同步(sql2008 触发器)

/****** Object: Trigger [dbo].[TR_C0T14] Script Date: 11/01/2011 13:21:04 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: <LEAMON>-- Create date: <2011-11-01>-- Description: <两个数据库表数据实时同步>-- =============================================--DROP TRIGGER TR_C0T14CREATE TRIGGER [dbo].[TR_C0T14] ON [dbo].[C0T14]FOR INSERT,UPDATE,DELETEASBEGINIF NOT EXISTS(SELECT * FROM deleted)BEGIN/*插入*/INSERT INTO leamon_test..C0T14(RATINGID,[BROKER],BROKERRATE,SFRATE,SFVALUE,F_OP1,F_OP2,F_OPC1,F_OPC2,F_9997,f _9998)SELECTRATINGID,[BROKER],BROKERRATE,SFRATE,SFVALUE,F_OP1,F_OP2,F_OPC1,F_OPC2,F_9997,f_ 9998FROM insertedWHERE NOT EXISTS (SELECT TOP 1 * FROM leamon_test..C0T14 WHERE inserted.RATINGID = leamon_test..C0T14.RATINGID)END/*删除*/ELSE IF NOT EXISTS(SELECT * FROM inserted)DELETE FROM leamon_test..C0T14WHERE RATINGID IN (SELECT RATINGID FROM deleted)-------/*若两个主键关联删除表数据ELSE IF NOT EXISTS(SELECT * FROM inserted)DELETE FROM [INPUT]..C1T30WHERE EXISTS (SELECT 1 FROM deleted B WHERE [INPUT]..C1T30.F_CODE=B.F_CODE AND[INPUT]..C1T30.REPORT=B.REPORT AND [INPUT]..C1T30.F_YEAR=B.F_YEAR) */-------/*更新*/ELSEBEGINUPDATE leamon_test..C0T14SET RATINGID = inserted.RATINGID,[BROKER] = inserted.[BROKER],BROKERRATE = inserted.BROKERRATE,SFRATE = inserted.SFRATE,SFVALUE = inserted.SFVALUE,F_OP1 = inserted.F_OP1,F_OP2 = inserted.F_OP2,F_OPC1 = inserted.F_OPC1,F_OPC2 = inserted.F_OPC2,F_9997 = inserted.F_9997,f_9998 = inserted.f_9998FROM insertedWHERE inserted.RATINGID = leamon_test..C0T14.RATINGIDAND (inserted.[BROKER] <> leamon_test..C0T14.[BROKER]OR inserted.BROKERRATE <> leamon_test..C0T14.BROKERRATEOR inserted.SFRATE <> leamon_test..C0T14.SFRATEOR inserted.SFVALUE <> leamon_test..C0T14.SFVALUEOR inserted.F_OP1 <> leamon_test..C0T14.F_OP1OR inserted.F_OP2 <> leamon_test..C0T14.F_OP2OR inserted.F_OPC1 <> leamon_test..C0T14.F_OPC1OR inserted.F_OPC2 <> leamon_test..C0T14.F_OPC2OR inserted.F_9997 <> leamon_test..C0T14.F_9997OR inserted.f_9998 <> leamon_test..C0T14.f_9998)ENDEND。

sql数据同步的方法

sql数据同步的方法

sql数据同步的方法SQL数据同步是一种重要的技术,它可以帮助确保数据库中的数据保持一致性和完整性。

以下是几种常见的SQL数据同步方法:1. 触发器(Triggers): 触发器是一种特殊的存储过程,它会在对表进行插入、更新或删除操作时自动执行。

通过在源表和目标表上设置触发器,可以在数据发生变化时自动将更改同步到目标表。

2. 复制(Replication): 复制是一种将数据从一个数据库复制到另一个数据库的技术。

它可以通过两种方式实现:异步复制和同步复制。

异步复制在数据写入源数据库后立即将更改写入目标数据库,而同步复制则等待源数据库确认已将更改写入后才将更改写入目标数据库。

3. 事务(Transactions): 事务是一组一起执行的SQL语句,它们被视为一个单一的工作单元。

如果事务中的所有语句都成功执行,则事务被提交,更改将永久保存在数据库中。

如果事务中的任何一个语句失败,则事务将被回滚,所有更改都将被撤销。

通过使用事务,可以确保在多个数据库之间同步数据时的一致性和完整性。

4. 消息队列(Message Queues): 消息队列是一种用于在应用程序之间传递消息的中间件技术。

它可以将数据变更写入消息队列,然后由目标数据库从消息队列中读取并应用这些变更。

这种方法可以确保在数据同步过程中实现异步处理和故障转移。

5. 全文检索(Full-Text Search): 对于需要同步大量文本数据的情况,全文检索是一种非常有用的技术。

通过使用全文检索引擎(如Apache Lucene或Microsoft SQL Server的全文搜索功能),可以索引和搜索大量文本数据,并将查询结果同步到其他数据库或系统中。

这些是常见的SQL数据同步方法,每种方法都有其优点和适用场景。

选择哪种方法取决于具体的需求和环境。

SQL Server 2008 R2 数据库之间的数据同步热备份

SQL Server 2008 R2 数据库之间的数据同步热备份

预期效果:数据库1的数据发生变化后,数据库2的数据根据数据库1的变化,实时进行数据同步,热备份。

前期准备(重点),在设置之前先要做的。

1.测试环境:Windows Server 2008 R2 SP1 + SQL Server 2008 R2 SP12.安装FTP 组件,FTP全部打勾,并在IIS里面新建FTP站点,并设置,这里要注意的地方有两点。

第一:要设置一个正常的登录用户,有密码和名字的那种,测试的时候,我同时也开启了匿名用户第二:就是FTP 的目录调整好,一般可能会调整两次以上,做好再调整的准备,原则是,所制定的位置就是发布服务器的生成位置,并在设置的时候设置正确。

3.防火墙,防火墙要设置好,避免测试的时候,制造麻烦。

可以先关闭。

4.Hosts ,这里要在两台服务器Host里面把自己和对方的计算机名字对应iP地址都写在双方的两个服务器里面,用与在连接的时候使用计算机名进行连接,看到很多网友都说要使用计算机名登录,而不是IP地址。

5.尽量用Windows 身份验证,同时要开启sa的登录方式。

用户必须在sysadmin组里面,这里说的组是SQL Server 的用户组。

6.两台电脑一定要启动SQL Server 代理7.建立的所有数据库的恢复模式为:完整8.SQL Server 的安装一定要记得,将数据库复制等复选框都选择上,之选一个关系数据库是不行的,其包含的复选框也都选择上。

配置部分:上面的工作都做完了并验证通过之后,开始配置1.先是要建立发布配置右键新建一个发布,没有特殊的地方。

上图》根据需要选择发布方式上图部分使用为配置权限,下面的sa为发布服务器的sa账户。

发布完成之后,右键选择发布项目,点击属性,来设置FTP发布方式。

如下图上面项目里面,照着选上,特别是上面的复选框,特别注意一下FTP登录用户,一定要在fTP上测试通过了,然后上面FTP开始路径的位置是你在设置FTP目录的时候,直接定位到“计算机名_数据库名_发布名“ 的这个目录的包含他的目录(不是这个目录)位置。

用触发器实现两个数据库之间相同表的同步

用触发器实现两个数据库之间相同表的同步

用触发器实现两个数据库之间相同表的同步2008-06-13 14:20近日单位建立OA服务器,要实现两台服务器间数据库表的同步。

一开始想采用订阅发布的模式,结果没有成功,连鸣大哥让我想一下怎么解决,结果我从网上找了用触发器实现的方法,觉得这种方法更适合我们的工作要求。

OA服务器更新较少,如果采用定时备份的方法会浪费服务器的效率,用触发器就可以在数据库发生变化的时候及时更新两台服务器的数据。

触发器的语法如下:Trigger on an INSERT, UPDA TE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_nameON { table | view }[ WITH <dml_trigger_option> [ ,...n ] ]{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }[ WITH APPEND ][ NOT FOR REPLICATION ]AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME <method specifier [ ; ] > }<dml_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ]<method_specifier> ::= assembly_name.class_name.method_name对两个服务器之间的表进行同步,首先要建立链接服务器。

在server1 上创建连接服务器,以便在server1 中操作server2,实现同步exec sp_addlinkedserver 'server2','','SQLOLEDB','server2的数据库实例名或ip'exec sp_addlinkedsrvlogin 'server2','false',null,'用户名','密码'gotrigger的代码如下:假设远程服务器的表是oa_userset ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoCREATE TRIGGER Trigger_Add_userON [dbo].[oa_user]AFTER INSERTASBEGINSET NOCOUNT ON;set xact_abort oninsert server2.hdoa.dbo.oa_userselect * from insertedEND按照网上的攻略所说,建立了上述的触发器,就可以当oa_user表进行插入操作的时候,本地服务器中的表也会有这条记录。

用SQL2008的MERGE语句同步表

用SQL2008的MERGE语句同步表

业务需要同步两表,就研究了一下2008的新功能,感觉还是不错的,怎么说也是系统的功能,同样的作用应该比自己手动做的好。

因为我是从没用过到刚会用,所以也只写这部分的心得,再深的请看专家们的BLOG。

先建好测试环境:USE TEMPDBGOIF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1IF OBJECT_ID('T2') IS NOT NULL DROP TABLE T2GOCREATE TABLE T1(ID1 INT,VAL1 VARCHAR(50))CREATE TABLE T2(ID2 INT,VAL2 VARCHAR(50))GOINSERT INTO T1SELECT 1,'A' UNION ALLSELECT 2,'B' UNION ALLSELECT 3,'C'现在我们的目标是让T2表与T1表同步,我直接把完整的MERGE语句帖上来,等下再细说各个部分:MERGE INTO T2 AS TB_TARGETUSING T1 AS TB_SOURCEON TB_TARGET.ID2=TB_SOURCE.ID1WHEN NOT MATCHED BY TARGET THENINSERT(ID2,VAL2)VALUES(ID1,VAL1)WHEN NOT MATCHED BY SOURCE THENDELETEWHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THENUPDATE SETTB_TARGET.VAL2=TB_SOURCE.VAL1OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2;看看MERGE语句输出的结果/*$ACTION ID2 VAL2 VAL2 ---------- ----------- ----------------------------------------------------------------------------------------------------INSERT 1 NULL A INSERT 2 NULL B INSERT 3 NULL C*/再看一下现在T2的内容:SELECT * FROM T2/*ID2 VAL2----------- --------------------------------------------------1 A2 B3 C*/可以看到T1的东东已经过去了,也就是说初步的同步完成了。

SQL触发器(有同步update的例子)

SQL触发器(有同步update的例子)

SQL触发器(有同步update的例子)触发器分为:DML触发器、DDL触发器、登录触发器原理如表格所示对表的操作inserted表deleted表增加记录(insert)存放增加的记录无删除记录(delete)无存放被删除的记录修改记录(update)存放更新后的记录存放更新前的记录insert:当对表进行INSERT操作时,INSERT触发器被激发,新的数据行被添加到创建触发器的表和Inserted表。

delete:先将要删除的记录存放在Deleted表里,然后把数据表里的记录删除,再激活After触发器,执行After触发器里的SQL语句。

执行完毕之后,删除内存中的Deleted表,操作结束。

update :生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除修改表里的旧的记录并写入新纪录。

update例子:创建触发器trigger_2,实现当修改“学生表”中的某个学生的学号时,对应“学生作业表”中的学号也作修改。

use studygocreate trigger trigger_2on studentfor updateasif update(stdid)beginupdate swset stdid = inserted.stdidfrom sw ,deleted,insertedwhere sw.stdid = deleted.stdidendgo查看student表的触发器exec sp_helptrigger 'student'查看trigger_2触发器的定义文本EXEC sp_helptext 'trigger_2'删除student表的trigger_2触发器drop trigger trigger_2修改DML触发器的语法格式如下:ALTER TRIGGER schema_name.trigger_nameON ( table | view )[ WITH ENCRYPTION ]{ FOR | AFTER | INSTEAD OF }{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE] }AS sql_statement [ ; ]修改DDL触发器的语法格式如下:ALTER TRIGGER trigger_nameON { ALL SERVER | DATABASE }[ WITH ENCRYPTION ]{ FOR | AFTER } { event_type | event_group } [ ,...n ] AS sql_statement [ ; ]使触发器无效:DISABLE TRIGGER { [ schema.] trigger_name [ ,...n ] | ALL }ON object_name使触发器有效:ENABLE TRIGGER {[schema_name.] trigger_name [ ,...n ] | ALL }ON object name记录数据库的网课学习。

SQL Server 2008 数据库同步的两种方式

SQL Server 2008 数据库同步的两种方式

SQL Server 2008 数据库同步的两种方式(发布、订阅)作者: tyb1222来源: 博客园发布时间: 2011-09-04 09:35 阅读: 68812 次推荐: 30 原文链接[收藏]上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作。

发布订阅份为两个步骤:1、发布。

2、订阅。

首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅。

发布可以发布一张表的部分数据,也可以对整张表进行发布。

下面分别介绍发布、订阅的过程。

一、发布。

发布需要用实际的服务器名称,不能使用服务器的IP地址进行。

能发布的信息包括【表】、【存储过程】、【用户函数】如果使用IP会有错误,如下图:具体发布过程如下:1、找到数据库服务器下的【复制】--【本地发布】,选择【新建发布】。

如下图:2、选择待发布的数据库。

如下图:3、选择发布类型。

这里选择的默认类型【快照发布】。

几种发布类型的区别,SQL SERVER都在下面给出了说明。

如下图:4、选择待发布的类容。

如下图:上图中右侧就是筛选的SQL语句。

5、设置快照代理。

如下图:更改同步频率如下图:6、设置代理安全性。

如下图:7、填写发布名称8、完成发布。

如下图:二、订阅。

订阅是对数据库发布的快照进行同步,将发布的数据源数据同步到目标数据库。

具体订阅过程如下;1、找到数据库服务器下的【复制】--【本地订阅】,选择【新建订阅】。

如下图:2、选择订阅的发布。

如下图:3、选择分发代理的位置;如下图:4、选择订阅服务器上的存放同步过来的数据的一个或者多个目标数据库。

如下图:若要添加多个订阅数据库,则点击【添加订阅服务器】。

如下图:5、设置分发代理的安全性。

如下图:6、设置同步计划。

如下图:7、完成订阅。

如下图:这样就完成了发布与订阅的整个流程。

这里,和上节一起就介绍完了SQL Server数据库同步的两种方式,希望对你有用。

如何通过触发器实现数据库的即时同步

如何通过触发器实现数据库的即时同步

如何通过触发器实现数据库的即时同步问题如何通过触发器实现数据库的即时同步?解答具体的解决方法请参考下文即时同步两个表的示例如下:测试环境如下:SQL Sever 数据库远程主机名:xz 用户名:sa 密码:无数据库名:test创建测试表请注意不能用标识列做主键因为不能进行正常的更新然后在本机上创建测试表注意远程主机上也要做同样的建表操作只是不写触发器if exists (select * from dbo sysobjects where id = object_id(N [test] ) and OBJECTPROPERTY(id N IsUserTable ) = )drop table [test]create table test(id int not null constraint PK_test primary key name varchar( ))go创建同步的触发器create trigger t_test on testfor insert update deleteasset 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 TRANSACTIONdelete 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 insertedmit trango插入数据测试insert into testselect aaunion all select bbunion all select cunion all select ddunion all select abunion all select bcunion all select ddd删除数据测试delete from test where id in( )更新数据测试update test set name=name+ _ where id in( )最后显示测试的结果select * from test a full joinlishixinzhi/Article/program/Oracle/201311/17111。

SqlServer2008 数据库同步的两种方式

SqlServer2008 数据库同步的两种方式

数据库同步是一种比较常用的功能。

以下结合我自己的体会整理的,如果有理解不完全或者有误的地方望大牛不理赐教。

下面介绍的就是数据库同步的两种方式:1、SQL JOB的方式sql Job的方式同步数据库就是通过SQL语句,将一个数据源中的数据同步到目标数据库中。

特点是它可以灵活的通过SQL的方式进行数据库之间的同步操作。

可以在制定的时间时间作为任务计划自动执行。

缺点是需要写SQL来进行操作。

既然是数据库之间的同步就涉及到数据库之间的连接。

建立连接是同步的第一步。

SQL Server建立连接可以通过系统存储过程建立【是否还有其他方式,我还不清楚】。

存储过程有以下几个:sp_droplinkedsrvlogin、sp_dropserver、sp_addlinkedserver、sp_addlinkedsrvlogin。

前面两个是删除数据库之间连接的,后两个是建立数据库之间连接的。

删除连接存储过程参数用法如下:a)sp_droplinkedsrvlogin语法sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'[ , [ @useself = ] 'useself' ][ , [ @locallogin= ] 'locallogin' ][ , [ @rmtuser = ] 'rmtuser' ][ , [ @rmtpassword = ] 'rmtpassword' ]参数[@rmtsrvname=] 'rmtsrvname'是应用登录映射的链接服务器名称。

rmtsrvname的数据类型为sysname,没有默认设置。

[@useself =] 'useself'决定用于连接到远程服务器的登录名称。

useself的数据类型为varchar(8),默认设置为TRUE。

不同数据库之间的实时同步

不同数据库之间的实时同步

最近一段时‎间前单位的‎同事问我有‎什么方法可‎以实现不同‎数据库之间‎表数据的同‎步,起初我‎告诉他可以‎用DATA‎G URAD‎,STRE‎A M,物化‎视图等技术‎手段实现。

‎但他告诉我‎需要同步数‎据的表并不‎多(有3-‎5张表需要‎同步)。

我‎就想通过编‎写触发器实‎现要更为简‎单一些。

通‎过几天的努‎力终于实现‎。

通过一些‎简单的测试‎感觉效果还‎可以,特总‎结一下奉献‎给大家。

之‎前论坛里有‎人问过此类‎问题,但很‎多高手都说‎可以用触发‎器实现,可‎是没有给出‎具体的实现‎方法。

可能‎他们认为非‎常easy‎,呵呵!在‎这里我帖出‎实现的具体‎方法和触发‎器的代码给‎当前有此需‎求的兄弟。

‎将来可能有‎此需求的兄‎弟可以将此‎作为备选方‎案,参考一‎下也可以。

‎同时请论坛‎里的高手多‎指点,多给‎出改进意见‎。

如果这篇‎文章对大家‎的工作有一‎定的帮助,‎那么希望大‎家能多给于‎支持。

谢谢‎!我将把大‎家的支持化‎作持续、深‎入学习OR‎A CLE的‎动力。

‎现在假设‎有两个数据‎库A,B,‎B库中的备‎用表需要和‎A库中的住‎表同步数据‎。

主表和备‎用表表名相‎同(也可以‎不同),都‎叫a1。

‎首先建立在‎A库所在的‎机器建立访‎问B库的网‎络服务名p‎r od,用‎N ET-M‎A NAGE‎R完成2‎。

创建PU‎B LIC ‎D ATAB‎A SE L‎I NK,先‎不指定用户‎名和密码‎C REAT‎E PUB‎L IC D‎A TABA‎S E LI‎N K pr‎o d US‎I NG '‎p rod'‎‎‎‎‎注意:‎ 'pr‎o d'表示‎第1步中创‎建的网络服‎务名,以s‎y s/sy‎s tem用‎户创建3‎。

在需要访‎问远程数据‎库用户下创‎建私有DA‎T ABAS‎E LIN‎K(同PU‎B LIC ‎D ATAB‎A SE L‎I NK名称‎相同),要‎具有CRE‎A TE D‎A TABA‎S E LI‎N K权限。

SQL2008数据库同步教程

SQL2008数据库同步教程

SQL2008数据库同步教程Sql server 2008数据库同步教程net user administrator /active:yes前言:此方案利用镜像的方法实现同步,与发布订阅方法相比具有以下优点:1、同步效率高,几乎是实时同步;2、数据库完整性好,能保证主、备服务器数据库高度统一;3、不需要区分数据库表有没有主键。

实现前提:1、主、备服务器系统版本与数据库版本一致;2、主、备服务器windows账户密码一致;3、主、备服务器sql server登录密码一致;4、主、备服务器同步前数据库完全一样(包括数据库名);5、主、备服务器在同一局域网内。

6、启用sql的tcp/ip,在配置管理器里设置(主备同时启用)7、主、备服务器sql server服务登录账户及密码一样(统一设为.\administrator,在配置管理器里设)8、登陆电脑要登administrator9、alter database 数据库名set partner off(删除数据库还原)具体操作步骤:主服务器名:sa-pc镜像服务器名:pc02数据库名:test1、登录主服务器sa-pc数据库,右击要同步的数据库test——属性——选项,将恢复模式设为完整。

2、备份主服务器sa-pc数据库,将备份类型选为“完整”。

3、备份主服务器数据库,将备份类型选为“事务日志”4、登录镜像服务器pc02数据库,依次将备份的数据和事务日志还原到镜像服务器上,选择“覆盖现有数据库”、“不对数据库执行任何操作……”(分两次还原,第一次先还原数据,第二次还原事务日志),还原完成后镜像服务器数据库test会显示“正在还原”5、登录主服务器sa-pc 数据库,右击要同步的数据库test ——任务——镜像,点击配置安全性进入配置数据库镜像安全向导,并点下一步6、根据实际选择是否需要见证服务器,这里选择“否”,7、设置主服务器名称、端口、端点名8、点击浏览更多,查找镜像服务器pc02,并设置端口及端点名称9、指定服务账户,这里设为sa(即sql server登录账户)10、点击“完成”,会提示“成功”,点“关闭”11、接下来会弹出选择框,选“不开始镜像”12、选择“高性能(异步)”,再点击开始镜像13、接下来会弹出一个窗口,选择“是”,镜像就完成了14、可以右击test数据库——任务——启动数据库镜像监视器,查看同步状态注意:1、在同步期间,镜像服务器上的数据库test始终是“正在还原状态”,无法查看表数据。

如何让MSSQL两个数据库的内容同步1

如何让MSSQL两个数据库的内容同步1

如何让MSSQL两个数据库的内容同步测试环境及同步要求:有数据库服务器srv1和srv2,两台电脑能互相访问,有数据srv1.库名..author有字段:ID,Name,phone,srv2.库名..author有字段:ID,Name,telphone,adress要求:srv1.库名..author增加记录则srv2.库名..author记录增加srv1.库名..author的phone字段更新,则srv2.库名..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 authorfor insertasset xact_abort Oninsert srv2.库名.dbo.author(ID,Name,telphone)select ID,Name,telphone from insertedgo--修改同步create trigger tr_update_author On authorfor updateasset xact_abort Onupdate B set Name=,telphone=i.telphonefrom srv2.库名.dbo.author B,inserted iwhere B.ID=i.IDgo--删除同步create trigger tr_delete_author On authorfor deleteasset xact_abort Ondelete Bfrom srv2.库名.dbo.author B,deleted dwhere B.ID=d.IDgo--3.实现同步处理的方法2,定时同步--在srv1中创建如下的同步处理存储过程create proc p_processas--更新修改过的数据update B set Name=,telphone=i.telphonefrom srv2.库名.dbo.author B,author iwhere B.ID=i.ID And(<> or B.telphone<>i.telphone)--插入新增的数据insert srv2.库名.dbo.author(ID,Name,telphone)select ID,Name,telphone from author iwhere not exists(select * from srv2.库名.dbo.author where ID=i.ID)--删除已经删除的数据(如果需要的话)delete Bfrom srv2.库名.dbo.author Bwhere not exists(select * from author where ID=B.ID)go--然后创建一个作业定时调用上面的同步处理存储过程就行了企业管理器--管理--SQL Server代理--右键作业--新建作业--"常规"项中输入作业名称--"步骤"项--新建--"步骤名"中输入步骤名--"类型"中选择"Transact-SQL 脚本(TSQL)"--"数据库"选择执行命令的数据库--"命令"中输入要执行的语句: exec p_process--确定--"调度"项--新建调度--"名称"中输入调度名称--"调度类型"中选择你的作业执行安排--如果选择"反复出现"--点"更改"来设置你的时间安排然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行设置方法:我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.。

数据库与数据库进行对接SQL同步不同数据库的表

数据库与数据库进行对接SQL同步不同数据库的表

//192.168.2.9中dbo.test_hr表中的數據拋入192.168.3.127中dbo.test insert intoOA_TO_HR.FlowMaster.dbo.test(id,a,b,c,d)(select * from dbo.test_hr)//在192.168.2.9中刪除192.168.3.127中dbo.test表中的數據delete from OA_TO_HR.FlowMaster.dbo.test//在192.168.2.9中查詢192.168.3.127中dbo.test表中的數據select * from OA_TO_HR.FlowMaster.dbo.test//192.168.3.127中dbo.test表中的數據拋入192.168.2.9中dbo.test_hr insert intoOA_HR.ESHR.dbo.test_hr(id,a,b,c,d)(select * from dbo.test)//在192.168.3.127中刪除192.168.2.9中dbo.test表中的數據delete from OA_HR.ESHR.dbo.test_hr//在192.168.3.127中查詢192.168.2.9中dbo.test表中的數據select * from OA_HR.ESHR.dbo.test_hr1、建立數據庫鏈接MSDTC 服務需開啟組件服務中的安全配置頁中的網絡訪問勾選2、新建作業現方式為將2.9服務器中表i_test數據寫入到2.34 ivan_t表中insert intosrv_link.rldata.dbo.ivan_t(uid,uname)(select*from dbo.i_test)select*from srv_link.rldata.dbo.ivan_tdelete from srv_link.rldata.dbo.ivan_tsrv_link為鏈接服務器名稱,可自定義rldata為數據庫名dbo常式,默認帶出ivan_t 表名192.168.2.9 i_test192.168.2.34ivan_t目的:將2.9中一個表i_test中的數據據定時同步寫入到2.34的新建的一個表ivan_t中第一步:在2.9中“服務器”對象——新建“鏈接服務器”如下圖:常規選項卡:鏈接服務器(N):srv_link(自行定義,后面有用處);產品名稱(U): 除了(SQL Server)外,其它的都可以使用;數據源:192.168.2.34(IP/或者數據庫服務器的名稱安全性選項卡:然后點擊確定,OK!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/****** Object: Trigger [dbo].[TR_C0T14] Script Date: 11/01/2011 13:21:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <LEAMON>
-- Create date: <2011-11-01>
-- Description: <两个数据库表数据实时同步>
-- =============================================
--DROP TRIGGER TR_C0T14
CREATE TRIGGER [dbo].[TR_C0T14] ON [dbo].[C0T14]
FOR INSERT,UPDATE,DELETE
AS
BEGIN
IF NOT EXISTS(SELECT * FROM deleted)
BEGIN
/*插入*/
INSERT INTO leamon_test..C0T14
(RATINGID,[BROKER],BROKERRATE,SFRATE,SFVALUE,F_OP1,F_OP2,F_OPC1,F_OPC2,F_9997,f _9998)
SELECT
RATINGID,[BROKER],BROKERRATE,SFRATE,SFVALUE,F_OP1,F_OP2,F_OPC1,F_OPC2,F_9997,f_ 9998
FROM inserted
WHERE NOT EXISTS (SELECT TOP 1 * FROM leamon_test..C0T14 WHERE inserted.RATINGID = leamon_test..C0T14.RATINGID)
END
/*删除*/
ELSE IF NOT EXISTS(SELECT * FROM inserted)
DELETE FROM leamon_test..C0T14
WHERE RATINGID IN (SELECT RATINGID FROM deleted)
-------
/*若两个主键关联删除表数据
ELSE IF NOT EXISTS(SELECT * FROM inserted)
DELETE FROM [INPUT]..C1T30
WHERE EXISTS (SELECT 1 FROM deleted B WHERE [INPUT]..C1T30.F_CODE=B.F_CODE AND
[INPUT]..C1T30.REPORT=B.REPORT AND [INPUT]..C1T30.F_YEAR=B.F_YEAR) */
-------
/*更新*/
ELSE
BEGIN
UPDATE leamon_test..C0T14
SET RATINGID = inserted.RATINGID,
[BROKER] = inserted.[BROKER],
BROKERRATE = inserted.BROKERRATE,
SFRATE = inserted.SFRATE,
SFVALUE = inserted.SFVALUE,
F_OP1 = inserted.F_OP1,
F_OP2 = inserted.F_OP2,
F_OPC1 = inserted.F_OPC1,
F_OPC2 = inserted.F_OPC2,
F_9997 = inserted.F_9997,
f_9998 = inserted.f_9998
FROM inserted
WHERE inserted.RATINGID = leamon_test..C0T14.RATINGID
AND (inserted.[BROKER] <> leamon_test..C0T14.[BROKER]
OR inserted.BROKERRATE <> leamon_test..C0T14.BROKERRATE
OR inserted.SFRATE <> leamon_test..C0T14.SFRATE
OR inserted.SFVALUE <> leamon_test..C0T14.SFVALUE
OR inserted.F_OP1 <> leamon_test..C0T14.F_OP1
OR inserted.F_OP2 <> leamon_test..C0T14.F_OP2
OR inserted.F_OPC1 <> leamon_test..C0T14.F_OPC1
OR inserted.F_OPC2 <> leamon_test..C0T14.F_OPC2
OR inserted.F_9997 <> leamon_test..C0T14.F_9997
OR inserted.f_9998 <> leamon_test..C0T14.f_9998
)
END
END。

相关文档
最新文档