两个数据库表数据实时同步(sql2008 触发器)
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)中通过触发器进行数据同步的设置说明根据公司领导要求,为了减轻数据库服务器上的压力。
特将其中一部分数据分离出来,放到另外一台数据库服务器上。
因此需要对基础数据进行一个同步操作。
要进行数据同步,可以通过代码、触发器、日志复制等。
因为此处涉及到的数据量不大,且不方便修改程序代码。
所有采取的是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 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中如何实现不同数据库的两张表的同步你可以分三个来写,分别用来监视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触发器语句摘要: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数据库间通过数据库链接和触发器同步两个数据库间数据为什么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 触发器)

/****** 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数据同步方法:1. 触发器(Triggers): 触发器是一种特殊的存储过程,它会在对表进行插入、更新或删除操作时自动执行。
通过在源表和目标表上设置触发器,可以在数据发生变化时自动将更改同步到目标表。
2. 复制(Replication): 复制是一种将数据从一个数据库复制到另一个数据库的技术。
它可以通过两种方式实现:异步复制和同步复制。
异步复制在数据写入源数据库后立即将更改写入目标数据库,而同步复制则等待源数据库确认已将更改写入后才将更改写入目标数据库。
3. 事务(Transactions): 事务是一组一起执行的SQL语句,它们被视为一个单一的工作单元。
如果事务中的所有语句都成功执行,则事务被提交,更改将永久保存在数据库中。
如果事务中的任何一个语句失败,则事务将被回滚,所有更改都将被撤销。
通过使用事务,可以确保在多个数据库之间同步数据时的一致性和完整性。
4. 消息队列(Message Queues): 消息队列是一种用于在应用程序之间传递消息的中间件技术。
它可以将数据变更写入消息队列,然后由目标数据库从消息队列中读取并应用这些变更。
这种方法可以确保在数据同步过程中实现异步处理和故障转移。
5. 全文检索(Full-Text Search): 对于需要同步大量文本数据的情况,全文检索是一种非常有用的技术。
通过使用全文检索引擎(如Apache Lucene或Microsoft SQL Server的全文搜索功能),可以索引和搜索大量文本数据,并将查询结果同步到其他数据库或系统中。
这些是常见的SQL数据同步方法,每种方法都有其优点和适用场景。
选择哪种方法取决于具体的需求和环境。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。