【问题标题】:SQL Server trigger update insert between table in different DBSQL Server在不同数据库中的表之间触发更新插入
【发布时间】: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


【解决方案1】:

这将是我经过大量搜索和错误后完成的最终代码。按预期工作。可能对其他人有所帮助。

USE [QMS]
GO
/****** Object:  Trigger [dbo].[afterInsertUpdate]    Script Date: 07/24/2015 12:00:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[afterInsertUpdate] ON [dbo].[USERTBL] AFTER Insert,Update
AS 
SET NOCOUNT ON;
--BEGIN

    --add updated/inserted data into temp table
    Insert Into QMS.[dbo].UserTBLTemp (USERID,USER_NAME,USER_LEVEL,PASSWORD,USER_GRP,STATUS,MODIFY_BY,MODIFY_DATE,
    LOGON_IND,SUPERVISOR_ID,STARTDATE,RESIGNDATE,COMPANY,PABXID,branch)
    Select a.USERID,a.USER_NAME,a.USER_LEVEL,a.PASSWORD,a.USER_GRP,a.STATUS,a.MODIFY_BY,a.MODIFY_DATE,a.LOGON_IND,
    a.SUPERVISOR_ID,a.STARTDATE,a.RESIGNDATE,a.COMPANY,a.PABXID,a.branch
    From inserted a
    Left Outer Join QMS.[dbo].UserTBLTemp b
    ON a.UserID = b.UserID
    Where b.UserID IS NULL

    --remove unneeded character
    UPDATE UserTBLTemp SET USER_NAME=replace(USER_NAME,'''',' '),UserID=replace(replace(UserID,'''',''),' ','') WHERE UserID IN (SELECT UserID FROM UserTBLTemp) 

    --update data from temp table if exist in dest table
    Update QMSFL.[dbo].UserTBL SET USERID=d.USERID, USER_NAME=d.USER_NAME, USER_LEVEL=d.USER_LEVEL,
    PASSWORD=d.PASSWORD, USER_GRP=d.USER_GRP, STATUS=d.STATUS, MODIFY_BY=d.MODIFY_BY,MODIFY_DATE=d.MODIFY_DATE,
    LOGON_IND=d.LOGON_IND,SUPERVISOR_ID=d.SUPERVISOR_ID,STARTDATE=d.STARTDATE,RESIGNDATE=d.RESIGNDATE,
    COMPANY=d.COMPANY,PABXID=d.USERID,branch=d.branch
    FROM QMSFL.[dbo].UserTBL c
    INNER Join UserTBLTemp d
    ON c.UserID=d.UserID

    Update QMSUC.[dbo].UserTBL SET USERID=f.USERID, USER_NAME=f.USER_NAME, USER_LEVEL=f.USER_LEVEL,
    PASSWORD=f.PASSWORD, USER_GRP=f.USER_GRP, STATUS=f.STATUS, MODIFY_BY=f.MODIFY_BY,MODIFY_DATE=f.MODIFY_DATE,
    LOGON_IND=f.LOGON_IND,SUPERVISOR_ID=f.SUPERVISOR_ID,STARTDATE=f.STARTDATE,RESIGNDATE=f.RESIGNDATE,
    COMPANY=f.COMPANY,PABXID=f.USERID,branch=f.branch
    FROM QMSUC.[dbo].UserTBL e
    INNER Join UserTBLTemp f
    ON e.UserID=f.UserID

    --insert data from temp table if not exist in dest table
    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 g.USERID,g.USER_NAME,g.USER_LEVEL,g.PASSWORD,g.USER_GRP,g.STATUS,g.MODIFY_BY,g.MODIFY_DATE,g.LOGON_IND,
    g.SUPERVISOR_ID,g.STARTDATE,g.RESIGNDATE,g.COMPANY,g.USERID,g.branch
    From QMS.[dbo].UserTBLTemp g
    Left Outer Join QMSFL.[dbo].UserTBL h
    ON g.UserID = h.UserID
    Where h.Userid IS NULL

    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 i.USERID,i.USER_NAME,i.USER_LEVEL,i.PASSWORD,i.USER_GRP,i.STATUS,i.MODIFY_BY,i.MODIFY_DATE,i.LOGON_IND,
    i.SUPERVISOR_ID,i.STARTDATE,i.RESIGNDATE,i.COMPANY,i.USERID,i.branch
    From QMS.[dbo].UserTBLTemp i
    Left Outer Join QMSUC.[dbo].UserTBL j
    ON i.UserID = j.UserID
    Where j.Userid IS NULL

    --empty data in temp table
    Delete From QMS.[dbo].UserTBLTemp

--END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 2011-02-16
    • 2015-01-15
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多