在数据库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
以上是小弟我自己的回答,能成功实现,如果有高手有更好的办法,提供给小弟我,我在此拜谢大家了!!!
何必非要触发器 可以考虑事物操作 将两个数据库的操作放入同一个事物中处理 如果操作成功则提交 不成攻则回滚
数据同步干嘛使用触发器呢?sql 数据库复制和发布技术不很好呢?预期使用触发器还不如使用merge新语法。
可以参考我的博客:http://www.cnblogs.com/zfanlong1314/archive/2013/03/27/2984726.html
我就是想用触发器来实现两个数据库中一表对应多表的关联
用其他方法我早就能实现了
就是用触发器还实现不了
@じ★ve寂寞: ASEET中没插入,删除或更改记录,数据库AntDB中也一样实现同步操作。
触发器建立在表上面的,只有表的记录发生了相应的变化时,才触发你建立的触发器!
ASEET中没插入,删除或更改记录,那怎么触发你建立的触发器呢?请问你什么时候要进行同步呢?
写个存储过程实现同步吧!
@422159763: 大哥你看清楚点,我说的是触发器,不是存储过程
@じ★ve寂寞: 说话,说说你的看法啊
@じ★ve寂寞: 呵呵。说什么啊、我沉默了。你太变态了~~~~~~触发器根本不是干这事的,你非要这么做!!!
sysservers 关键是这个
exec sp_addlinkedserver '目标服务器地址\数据库',N'SQL Server'
EXEC sp_addlinkedsrvlogin '目标服务器地址\数据库', 'false', NULL, '登录用户', '密码'
select * from [目标服务器地址\数据库].dbo.hs_Group.Col_Name
额 忘记加数据库名了 在dbo前面。。。
这个别放触发器里面 外面执行以下 你在服务器对象>链接服务器里面就能看得到这个链接了,
@tomcat1988: 你看清楚了吗,我编译能过,就是在插值的时候报错
违反了 PRIMARY KEY 约束 'PK_linkbook'。不能在对象 'dbo.linkbook' 中插入重复键。
语句已终止。
@じ★ve寂寞: 见鬼了 早上貌似不是这个错啊。
@じ★ve寂寞: 说话,说说你的看法啊
@じ★ve寂寞: 说话,说说你的看法啊
@じ★ve寂寞: 插入前判断一下是否存在 存在就修改否则插入 明显linkbook已经存在你要插入的数据了。。主键冲突了。
ID自增的就别插入了。
---------------------------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
这是小弟我自己的回答,请大家阅览,谢谢,终于结贴了,哈哈!!!