【发布时间】:2015-10-02 13:35:07
【问题描述】:
我在同一台服务器上拥有三个 SQL Server 数据库。之前,我必须使用查询在所有三个数据库上手动更新/插入。现在我希望使用触发器来完成。
我创建了一个触发器,但在更新时,另一个表上的所有行都已更新为相同的数据。
下面是更新不同数据库上其他表的触发器。
USE [QMS]
GO
/****** Object: Trigger [dbo].[afterUserUpdate] Script Date: 07/14/2015 12:19:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[afterUserUpdate] ON [dbo].[USERTBL] AFTER Update
AS
BEGIN
IF @@rowcount = 0 RETURN;
Update QMSFL.[dbo].UserTBL SET USERID=b.USERID, USER_NAME=b.USER_NAME, USER_LEVEL=b.USER_LEVEL,
PASSWORD=b.PASSWORD, USER_GRP=b.USER_GRP, STATUS=b.STATUS, MODIFY_BY=b.MODIFY_BY,MODIFY_DATE=b.MODIFY_DATE,LOGON_IND=b.LOGON_IND,
SUPERVISOR_ID=b.SUPERVISOR_ID,STARTDATE=b.STARTDATE,RESIGNDATE=b.RESIGNDATE,COMPANY=b.COMPANY,PABXID=b.PABXID,branch=b.branch
FROM QMSFL.[dbo].UserTBL a
INNER Join inserted b ON a.UserID=b.UserID
WHERE a.userid IN (SELECT userid FROM inserted)
Update QMSUC.[dbo].UserTBL SET USERID=b.USERID, USER_NAME=b.USER_NAME, USER_LEVEL=b.USER_LEVEL,
PASSWORD=b.PASSWORD, USER_GRP=b.USER_GRP, STATUS=b.STATUS, MODIFY_BY=b.MODIFY_BY,MODIFY_DATE=b.MODIFY_DATE,LOGON_IND=b.LOGON_IND,
SUPERVISOR_ID=b.SUPERVISOR_ID,STARTDATE=b.STARTDATE,RESIGNDATE=b.RESIGNDATE,COMPANY=b.COMPANY,PABXID=b.PABXID,branch=b.branch
FROM QMSFL.[dbo].UserTBL a
INNER Join inserted b ON a.UserID=b.UserID
WHERE a.userid IN (SELECT userid FROM inserted)
END
下面是插入后触发器。尚未测试,因为我担心会发生一些不好的事情,比如更新触发器。征求你的意见这样可以吗。
USE [QMS]
GO
/****** Object: Trigger [dbo].[afterUserInsert] Script Date: 07/14/2015 12:31:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[afterUserInsert] ON [dbo].[USERTBL] AFTER INSERT
AS
BEGIN
IF @@rowcount = 0 RETURN;
Insert Into QMSFL.[dbo].UserTBL (USERID,USER_NAME,USER_LEVEL,PASSWORD,USER_GRP,STATUS,MODIFY_BY,
MODIFY_DATE,LOGON_IND,SUPERVISOR_ID,STARTDATE,RESIGNDATE,COMPANY,PABXID,branch)
Select USERID,USER_NAME,USER_LEVEL,
PASSWORD,USER_GRP,STATUS,MODIFY_BY,MODIFY_DATE,LOGON_IND,SUPERVISOR_ID,STARTDATE,RESIGNDATE,
COMPANY,PABXID,branch From inserted
Insert Into QMSUC.[dbo].UserTBL (USERID,USER_NAME,USER_LEVEL,PASSWORD,USER_GRP,STATUS,MODIFY_BY,
MODIFY_DATE,LOGON_IND,SUPERVISOR_ID,STARTDATE,RESIGNDATE,COMPANY,PABXID,branch)
Select USERID,USER_NAME,USER_LEVEL,PASSWORD,USER_GRP,STATUS,MODIFY_BY,MODIFY_DATE,LOGON_IND,
SUPERVISOR_ID,STARTDATE,RESIGNDATE,COMPANY,PABXID,branch From inserted
END;
最后,是否可以在一个触发器中更新/插入这些内容。?并尽可能提供更新的工作触发器。
谢谢...=)
更新:简而言之,如何在一个触发器中更新多个表。
【问题讨论】:
-
您不使用复制等内置解决方案的任何原因?在触发器中触及同一数据库之外的任何资源通常是个坏主意。
-
replication 会将数据库 QMS 中的 usertbl 表中的数据复制到数据库 QMSFL/QMSUC 中的 usertbl 表中。但在我的例子中,数据库 QMSFL/QMSUC 中的表被不同的应用程序使用,并且可以独立更新。数据库 QMS 中的表 usertbl 将作为主服务器更新或添加任何数据到所有三个数据库(如管理员)。
-
例如:用户使用带有数据库 QMSFL 的应用程序更新他们的密码。然后在复制期间应删除此更改。因为该应用程序只能访问该数据库。
-
更新适用于 QMSFL 中的第一个表......但不适用于第二个表(QMSUC),因为第二个表上的所有数据都被复制了......
标签: sql-server triggers