数据库中两张表之间的数据同步增加、删除

本文提供了一套SQL Server环境下实现两张表间数据同步的触发器实例,包括增加、删除和更新三种场景。

推荐:sql server 中合并某个字段值的实例
sql server 中合并某个字段值的实例,需要的朋友可以参考一下

分别创建增加、删除、更新的触发器(Trigger)来达到两张表之间数据同步的目的。 
1:数据同步增加 : 
如有两张表——A表和B表,创建触发器使当A表插入数据后B表也同步插入数据。其中B表插入数据的字段需要同A表中的字段相对应。 
复制代码代码如下: www.mb5u.com

CREATE TRIGGER 触发器名称 
ON A表 
AFTER INSERT 
AS BEGIN INSERT INTO 
B表(B表字段1,B表字段2,B表字段3) 
SELECT A表字段1,A表字段2,A表字段3 
FROM INSERTED 
END 

2.数据同步删除 : 
如有两张表——A表和B表,创建触发器使当A表删除数据后B表也同步删除数据。其中B表与A表应有相应主键关联。 
复制代码代码如下: www.mb5u.com

CREATE TRIGGER 触发器名称 
ON A表 
AFTER DELETE 
AS BEGIN DELETE B表 
WHERE 
B表主键 IN( 
SELECT A表主键 
FROM DELETED) 
END 

3.数据同步更新 : 
如有两张表——A表和B表,创建触发器使当A表数据更新后B表也同步更新数据。 
复制代码代码如下: www.mb5u.com

CREATE TRIGGER 触发器名称 
ON A表 
AFTER UPDATE 
AS 
update B表 
SET 
B.B表字段1=A.A表字段1 
FROM 
B表 AS B,INSERTED AS A 
WHERE B.B表主键=A.A表主键 

分享:SSB(SQLservice Service Broker) 入门实例介绍
前两天用了 MSsql里的 SSB委托机制,做了一个消息分发的小功能,在这里简单跟大家分享一下方法跟实例

在Java后台实现SQL Server数据库两张同步的方法可以考虑以下几种: ### 定时任务同步 使用Java的定时任务框架(如Quartz),定期查询源的数据,然后将这些数据插入或更新到目标。以下是一个简单示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class TableSyncJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { try { // 加载驱动 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // 建立连接 Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=yourDB", "username", "password"); Statement stmt = conn.createStatement(); // 查询源数据 ResultSet rs = stmt.executeQuery("SELECT * FROM source_table"); while (rs.next()) { // 插入或更新目标数据 String id = rs.getString("id"); String name = rs.getString("name"); // 检查目标是否存在该记录 ResultSet checkRs = stmt.executeQuery("SELECT * FROM target_table WHERE id = '" + id + "'"); if (checkRs.next()) { // 更新记录 stmt.executeUpdate("UPDATE target_table SET name = '" + name + "' WHERE id = '" + id + "'"); } else { // 插入记录 stmt.executeUpdate("INSERT INTO target_table (id, name) VALUES ('" + id + "', '" + name + "')"); } } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 触发器同步 在SQL Server数据库中创建触发器,当源数据发生变化时,触发器自动将变化的数据同步到目标。在Java中可以通过执行SQL语句来创建触发器。示例SQL语句如下: ```sql CREATE TRIGGER sync_trigger ON source_table AFTER INSERT, UPDATE, DELETE AS BEGIN -- 插入操作同步 INSERT INTO target_table (id, name) SELECT id, name FROM inserted; -- 删除操作同步 DELETE FROM target_table WHERE id IN (SELECT id FROM deleted); -- 更新操作同步 UPDATE target_table SET name = (SELECT name FROM inserted WHERE inserted.id = target_table.id) WHERE id IN (SELECT id FROM inserted); END; ``` 在Java中执行上述SQL语句创建触发器: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class TriggerCreation { public static void main(String[] args) { try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=yourDB", "username", "password"); Statement stmt = conn.createStatement(); String triggerSql = "CREATE TRIGGER sync_trigger ON source_table AFTER INSERT, UPDATE, DELETE AS BEGIN INSERT INTO target_table (id, name) SELECT id, name FROM inserted; DELETE FROM target_table WHERE id IN (SELECT id FROM deleted); UPDATE target_table SET name = (SELECT name FROM inserted WHERE inserted.id = target_table.id) WHERE id IN (SELECT id FROM inserted); END;"; stmt.executeUpdate(triggerSql); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 数据库日志捕获同步 SQL Server有事务日志,通过Java程序可以监控事务日志,捕获源的变更信息,然后将这些变更同步到目标。可以使用SQL Server的CDC(Change Data Capture)功能。首先需要在数据库中启用CDC: ```sql EXEC sys.sp_cdc_enable_db; EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'source_table', @role_name = NULL; ``` 然后在Java中编写程序读取CDC变更数据并同步到目标: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class CDCSync { public static void main(String[] args) { try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=yourDB", "username", "password"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM cdc.dbo_source_table_CT"); while (rs.next()) { // 处理变更数据并同步到目标 // ... } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值