【问题标题】:SQL Trigger - How to update a table whenever another table in another database is being updated?SQL 触发器 - 如何在更新另一个数据库中的另一个表时更新一个表?
【发布时间】:2015-10-01 18:27:41
【问题描述】:

所以我在数据库 test1 中有一个名为“persons”的表:

CREATE TABLE [dbo].[persons](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [LastName] [varchar](50) NULL,
    [FirstName] [varchar](50) NULL,
    [Job] [varchar](50) NULL,
    [Extension] [char](10) NULL,
    [EMail] [varchar](50) NULL,
    [Dept] [int] NULL,
    [MobileNumber] [char](10) NULL,
    [District] [int] NULL,
    [Status] [varchar](50) NULL,
    [InOutStatus] [varchar](5) NULL,
    [InOutDescr] [varchar](50) NULL,
    [InOutDirections] [varchar](255) NULL,
    [InOutReturn] [varchar](50) NULL,
    [login] [varchar](50) NULL,
    [StatusExpiry] [datetime] NULL
) ON [PRIMARY]

还有一个数据库 test2 中名为“Users”的表:

CREATE TABLE [dbo].[Users](
    [User_ID] [int] NOT NULL,
    [Firstname] [nvarchar](50) NULL,
    [Lastname] [nvarchar](50) NULL,
    [Username] [nvarchar](50) NULL,
    [Status] [nvarchar](50) NULL
) ON [PRIMARY]

我要做的是创建一个触发器,如果​​更新了persons 表中的FirstName、LastName、login 和/或Status 列,那么在Users 表的相同列中更新相同的值。这是我想出的触发器,但它不起作用:

ALTER TRIGGER [dbo].[UserUpdteTrig]
   ON  [dbo].[persons]
   AFTER UPDATE
AS 
BEGIN
    DECLARE @uid int;
    DECLARE @fname nvarchar(50);
    DECLARE @lname nvarchar(50);
    DECLARE @uname nvarchar(50);
    DECLARE @stat nvarchar(50);


    SELECT @fname = i.FirstName, @lname = i.LastName, @uname = i.login, @stat = i.Status
    FROM inserted i

    UPDATE [test2].[dbo].[Users]
    SET Firstname = @fname , Lastname = @lname, Username = @uname, Status = @stat
    FROM [test2].[dbo].[Users] u INNER JOIN inserted i ON u.User_ID = i.ID

END

我不断收到一条错误消息:更新和删除的行值要么不使行唯一,要么更改多行,这两个表中的 PK 都是唯一的,无论如何都不应该更改 PK。

【问题讨论】:

  • 我相信我看到了,但它并没有解决我的问题。我不断收到一条错误消息:更新和删除的行值要么不使行唯一,要么更改多行,这两个表中的 PK 都是唯一的,无论如何都不应该更改 PK。

标签: sql-server sql-server-2008


【解决方案1】:

您根本不需要任何变量,只需一个简单的更新就足够了。

ALTER TRIGGER [dbo].[UserUpdteTrig]
   ON  [dbo].[persons]
   AFTER UPDATE
AS 
BEGIN
 SET NOCOUNT ON;

     UPDATE u 
    SET u.Firstname = i.FirstName
      , u.Lastname  = i.Lastname
      , u.Username  = i.Username
      , u.[Status]  = i.[Status]
    FROM [test2].[dbo].[Users] u 
    INNER JOIN inserted i ON u.[User_ID] = i.ID


END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 2015-12-28
    • 1970-01-01
    • 2012-02-13
    • 2011-07-12
    • 1970-01-01
    • 2013-01-25
    • 2020-11-10
    相关资源
    最近更新 更多