日期:2014-05-18  浏览次数:20560 次

如何将触发器改写成存储过程?(为解决触发器对象 名称 'XX' 包含的前缀超出了最大限值。
两个数据库做用户表同步。
数据库1 建立了 srv2连接 数据2这里先不用管。

SQL code


--主站触发器(INSERT USER)
create trigger tr_insert_User on [ZJ_User]
for insert
as
set xact_abort on
alter table srv2.sqldata02.dbo.Dv_User disable trigger all--禁用论坛表触发器,为防止2个表插入死循环
insert srv2.sqldata02.dbo.Dv_User
(UserName,UserPassword,UserEmail,UserSex,JoinDate,LastLogin,UserLogins,UserBirthday,UserQuesion,UserAnswer,UserLastIP,LastIPInfo)  
select 
UserName,UserPassword,UserEmail,UserSex,JoinDate,LastLogin,UserLogins,UserBirthday,UserQuesion,UserAnswer,UserLastIP,LastIPInfo from inserted
alter table srv2.sqldata02.dbo.Dv_User enable trigger all--启用论坛表触发器


go

--主站触发器(UPDATE USER)
create trigger tr_update_User on [ZJ_User]
for update
as
set xact_abort on
alter table srv2.sqldata02.dbo.Dv_User disable trigger all--禁用论坛表触发器
update srv2.sqldata02.dbo.Dv_User set UserPassword=i.UserPassword,UserEmail=i.UserEmail,UserSex=i.UserSex,JoinDate=i.JoinDate,LastLogin=i.LastLogin,UserLogins=i.UserLogins,UserBirthday=i.UserBirthday,UserQuesion=i.UserQuesion,UserAnswer=i.UserAnswer,UserLastIP=i.UserLastIP,LastIPInfo=i.LastIPInfo 
from srv2.sqldata02.dbo.Dv_User,inserted i,deleted d 
where i.[UserName]=d.[UserName] and i.[UserName]=srv2.sqldata02.dbo.Dv_User.[UserName]
alter table srv2.sqldata02.dbo.Dv_User enable trigger all--启用论坛表触发器



错误提示:
消息 156,级别 15,状态 1,过程 InsertUserToBBS,第 2 行
关键字 'set' 附近有语法错误。
消息 117,级别 15,状态 1,过程 InsertUserToBBS,第 3 行
对象 名称 'srv2.sqldata02.dbo.Dv_User' 包含的前缀超出了最大限值。最多只能有 2 个。
消息 117,级别 15,状态 1,过程 InsertUserToBBS,第 8 行
对象 名称 'srv2.sqldata02.dbo.Dv_User' 包含的前缀超出了最大限值。最多只能有 2 个。

以前同一服务器因为直接用的是 windows权限不需要建立连接,不会超过对象的.个数。
现在不同数据库就遇到问题了。

网上查询说写成存储过程可以解决,不过没见到怎么写成存储过程的例子。 哪位能帮忙写个? 万分感谢!

------解决方案--------------------
先按照提示把对应的语法错误改了试试,你这个肯定存在语法问题
update srv2.sqldata02.dbo.Dv_User set UserPassword=i.UserPassword,UserEmail=i.UserEmail,UserSex=i.UserSex,JoinDat
红色部分语法肯定错误
srv2.[sqldata02.dbo.Dv_User]
这样试试,主意当表名里面也存在xxx.xxx的时候要把它[xxx.xxx]后再加前缀

xxx.[xxx.xxx]
------解决方案--------------------
探讨
上面这个问题估计不用回答了。

我原来的服务器是自己的,现在因为数据服务器硬盘2年坏一次,我干脆租了一个。
在对方服务器给的用户名没权限创建以下数据连接

exec sp_addlinkedserver 'srv2','','SQLOLEDB','服务器地址'
exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码'

能在触……

------解决方案--------------------
将 逻辑处理过程用 存储过程实现。触发器调用该存储过程。