首页新闻找找看学习计划

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

-1
悬赏园豆:60 [已关闭问题] 关闭于 2013-04-07 09:38

在数据库asset的dbo.linkbook中存在字段:id(用户的编号),uid(用户登录名),name(用户姓名),unit(用户公司名称),department(部门名称)post(职位名称)等字段;

在数据库AntDB中dbo.hs_user存在col_id,col_LonginName,col_Job等字段,

 dbo.hs_group(部门表)存在col_name(部门名称)等字段

 dbo.hs_view(公司表)存在col_name(公司名称)等字段,

以下是小弟我写的代码:望各位指教一二

---------------------------insert触发器-------------------------------------------------

---- create trigger必须是批处理(go)的第一句

ALTER trigger [insert_AntDB]
on [dbo].[linkbook] for insert
as
begin
 
------------------ 插入公司信息 -----------------------

 begin
  declare @unit varchar(100)
  select @unit=unit from inserted
   if exists(select*from AntDB.dbo.hs_View where Col_Name=@unit)
    delete from AntDB.dbo.hs_View where Col_Name=@unit
 
  insert into AntDB.dbo.hs_View(Col_Name)
  select @unit from inserted
 end

------------------ 插入部门信息 ------------------------
 
 begin
  declare @department varchar(100)
  select @department=department from inserted
   if exists(select*from AntDB.dbo.hs_Group where Col_Name=@department)
    delete from AntDB.dbo.hs_Group where Col_Name=@department
 
  insert into AntDB.dbo.hs_Group(Col_Name)
  select @department from inserted
 end

------------------ 插入用户信息 -------------------------

------- 通过搜索insert临时表的相关字段实现一一对应 ------

 begin
  declare  

  @id int,  -----用户的主键  

  @uid varchar(100),  ---- 用户的账户
    @name varchar(20),  ---- 姓名
    @mobile varchar(50),  ---- 手机号
    @script varchar(200),  ---- 对用户的相关描述
    @zone varchar(100),  ---- 单位地址
    @post varchar(50),  ---- 职位 
    @tel varchar(50),  ---- 工作电话
    @unit_code varchar(100) ---- 用户部门编号
  select @id=id,@uid=uid,@name=name,@mobile=mobile,@script=script,@zone=zone,@post=post,@tel=tel,@unit_code=unit_code from inserted
-------- 通过搜索用户的uid来判断是否存在该记录,若存在则删除 
   if exists(select*from AntDB.dbo.hs_User where Col_ID=@id)
    DELETE AntDB.dbo.hs_User WHERE AntDB.dbo.hs_User.Col_LoginName in (
     SELECT @id FROM deleted)
-------- 重新插入新的用户的信息来保证唯一性  
  insert into AntDB.dbo.hs_User(Col_LoginName,Col_Name,Col_Mobile,Col_Description,Col_o_Address,Col_o_JobTitle,Col_o_Phone,Col_DeptID)
  select @uid,@name,@mobile,@script,@zone,@post,@tel,@unit_code from inserted
 end
end

---------------------delete触发器-------------------------------------------------

ALTER TRIGGER [delete_AntDB]
   ON  [dbo].[linkbook]
   AFTER DELETE
AS
BEGIN
 DELETE AntDB.dbo.hs_User WHERE
  AntDB.dbo.hs_User.Col_LoginName in (
 SELECT id FROM deleted)
END

 ---------------------------------update触发器-------------------------------------------------------

ALTER trigger [update_AntDB]
on [dbo].[linkbook]
after delete,insert
as
 begin
 begin
  delete AntDB.dbo.hs_User WHERE
   AntDB.dbo.hs_User.Col_LoginName in (
   select uid from deleted)
 end

 begin
  insert into AntDB.dbo.hs_User(Col_LoginName,Col_Name,Col_Mobile,Col_o_Address,Col_o_JobTitle,Col_o_Phone,Col_DeptID)
  select uid,name,mobile,zone,post,tel,unit_code from inserted
 end
end

以上是小弟我自己的回答,能成功实现,如果有高手有更好的办法,提供给小弟我,我在此拜谢大家了!!!

じ★ve寂寞的主页 じ★ve寂寞 | 初学一级 | 园豆:107
提问于:2013-03-29 17:54
< >
分享
所有回答(6)
0

与其等待和拜谢,不如自己花点时间,看资料 http://msdn.microsoft.com/en-us/library/ms189799.aspx

陈希章 | 园豆:2338 (老鸟四级) | 2013-03-30 07:42
0

何必非要触发器 可以考虑事物操作 将两个数据库的操作放入同一个事物中处理 如果操作成功则提交 不成攻则回滚

、浮尘年代。 | 园豆:239 (菜鸟二级) | 2013-03-30 12:34
0

不建议使用触发器解决这类问题。

实际上触发器真没感觉它有具体大的作用。

````` | 园豆:14268 (专家六级) | 2013-03-31 21:40
0

数据同步干嘛使用触发器呢?sql 数据库复制和发布技术不很好呢?预期使用触发器还不如使用merge新语法。

可以参考我的博客:http://www.cnblogs.com/zfanlong1314/archive/2013/03/27/2984726.html

跟着阿笨一起玩.NET | 园豆:5 (初学一级) | 2013-04-01 11:47

我就是想用触发器来实现两个数据库中一表对应多表的关联

支持(0) 反对(0) じ★ve寂寞 | 园豆:107 (初学一级) | 2013-04-01 12:05

用其他方法我早就能实现了

就是用触发器还实现不了

支持(0) 反对(0) じ★ve寂寞 | 园豆:107 (初学一级) | 2013-04-01 12:07

@じ★ve寂寞: ASEET中没插入,删除或更改记录,数据库AntDB中也一样实现同步操作。

触发器建立在表上面的,只有表的记录发生了相应的变化时,才触发你建立的触发器!

ASEET中没插入,删除或更改记录,那怎么触发你建立的触发器呢?请问你什么时候要进行同步呢?

写个存储过程实现同步吧!

@422159763: 大哥你看清楚点,我说的是触发器,不是存储过程

支持(0) 反对(0) じ★ve寂寞 | 园豆:107 (初学一级) | 2013-04-02 08:52

@じ★ve寂寞: 说话,说说你的看法啊

支持(0) 反对(0) じ★ve寂寞 | 园豆:107 (初学一级) | 2013-04-02 16:15

@じ★ve寂寞: 呵呵。说什么啊、我沉默了。你太变态了~~~~~~触发器根本不是干这事的,你非要这么做!!!

0

sysservers 关键是这个

exec sp_addlinkedserver '目标服务器地址\数据库',N'SQL Server'
EXEC sp_addlinkedsrvlogin '目标服务器地址\数据库', 'false', NULL, '登录用户', '密码'

 

select * from [目标服务器地址\数据库].dbo.hs_Group.Col_Name

丫的 | 园豆:1575 (小虾三级) | 2013-04-02 10:17

额 忘记加数据库名了 在dbo前面。。。

这个别放触发器里面 外面执行以下 你在服务器对象>链接服务器里面就能看得到这个链接了,

支持(0) 反对(1) 丫的 | 园豆:1575 (小虾三级) | 2013-04-02 10:23

@tomcat1988: 你看清楚了吗,我编译能过,就是在插值的时候报错

违反了 PRIMARY KEY 约束 'PK_linkbook'。不能在对象 'dbo.linkbook' 中插入重复键。
语句已终止。

支持(0) 反对(0) じ★ve寂寞 | 园豆:107 (初学一级) | 2013-04-02 16:00

@じ★ve寂寞: 见鬼了 早上貌似不是这个错啊。

支持(0) 反对(0) 丫的 | 园豆:1575 (小虾三级) | 2013-04-02 16:09

@じ★ve寂寞: 说话,说说你的看法啊

支持(0) 反对(0) じ★ve寂寞 | 园豆:107 (初学一级) | 2013-04-02 16:15

@じ★ve寂寞: 说话,说说你的看法啊

支持(0) 反对(0) じ★ve寂寞 | 园豆:107 (初学一级) | 2013-04-02 16:16

@じ★ve寂寞: 插入前判断一下是否存在 存在就修改否则插入 明显linkbook已经存在你要插入的数据了。。主键冲突了。

 

ID自增的就别插入了。

支持(0) 反对(0) 丫的 | 园豆:1575 (小虾三级) | 2013-04-02 16:18
0

---------------------------insert触发器-------------------------------------------------

---- create trigger必须是批处理(go)的第一句

ALTER trigger [insert_AntDB]
on [dbo].[linkbook] for insert
as
begin
 
------------------ 插入公司信息 -----------------------

 begin
  declare @unit varchar(100)
  select @unit=unit from inserted
   if exists(select*from AntDB.dbo.hs_View where Col_Name=@unit)
    delete from AntDB.dbo.hs_View where Col_Name=@unit
 
  insert into AntDB.dbo.hs_View(Col_Name)
  select @unit from inserted
 end

------------------ 插入部门信息 ------------------------
 
 begin
  declare @department varchar(100)
  select @department=department from inserted
   if exists(select*from AntDB.dbo.hs_Group where Col_Name=@department)
    delete from AntDB.dbo.hs_Group where Col_Name=@department
 
  insert into AntDB.dbo.hs_Group(Col_Name)
  select @department from inserted
 end

------------------ 插入用户信息 -------------------------

------- 通过搜索insert临时表的相关字段实现一一对应 ------

 begin
  declare @uid varchar(100),  ---- 用户的账户
    @name varchar(20),  ---- 姓名
    @mobile varchar(50),  ---- 手机号
    @script varchar(200),  ---- 对用户的相关描述
    @zone varchar(100),  ---- 单位地址
    @post varchar(50),  ---- 职位 
    @tel varchar(50),  ---- 工作电话
    @unit_code varchar(100) ---- 用户部门编号
  select @uid=uid,@name=name,@mobile=mobile,@script=script,@zone=zone,@post=post,@tel=tel,@unit_code=unit_code from inserted
-------- 通过搜索用户的uid来判断是否存在该记录,若存在则删除 
   if exists(select*from AntDB.dbo.hs_User where Col_LoginName=@uid)
    DELETE AntDB.dbo.hs_User WHERE AntDB.dbo.hs_User.Col_LoginName in (
     SELECT @uid FROM deleted)
-------- 重新插入新的用户的信息来保证唯一性  
  insert into AntDB.dbo.hs_User(Col_LoginName,Col_Name,Col_Mobile,Col_Description,Col_o_Address,Col_o_JobTitle,Col_o_Phone,Col_DeptID)
  select @uid,@name,@mobile,@script,@zone,@post,@tel,@unit_code from inserted
 end
end

---------------------delete触发器-------------------------------------------------

ALTER TRIGGER [delete_AntDB]
   ON  [dbo].[linkbook]
   AFTER DELETE
AS
BEGIN
 DELETE AntDB.dbo.hs_User WHERE
  AntDB.dbo.hs_User.Col_LoginName in (
 SELECT uid FROM deleted)
END

 ---------------------------------update触发器-------------------------------------------------------

ALTER trigger [update_AntDB]
on [dbo].[linkbook]
after delete,insert
as
 begin
 begin
  delete AntDB.dbo.hs_User WHERE
   AntDB.dbo.hs_User.Col_LoginName in (
   select uid from deleted)
 end

 begin
  insert into AntDB.dbo.hs_User(Col_LoginName,Col_Name,Col_Mobile,Col_o_Address,Col_o_JobTitle,Col_o_Phone,Col_DeptID)
  select uid,name,mobile,zone,post,tel,unit_code from inserted
 end
end

这是小弟我自己的回答,请大家阅览,谢谢,终于结贴了,哈哈!!!

じ★ve寂寞 | 园豆:107 (初学一级) | 2013-04-03 10:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册