更新触发器旧值自然键

时间:2011-06-04 21:11:30

标签: sql sql-server-2008

我有一个帐户所有者作为主键的帐户表。在更新触发器中,我想将一些帐户更新为新所有者。由于此表没有id字段,如何在触发器中使用插入/更新的表? DB是sql server 2008。

CREATE TRIGGER accounts_change_owner on accounts AFTER INSERT
AS BEGIN
   MERGE INTO accounts t
   USING 
   (
       SELECT *
       FROM inserted e
           INNER JOIN deleted f ON 
              e.account_owner = f.account_owner ---this won't work since the new account owner value is diff
   ) d
   ON (t.account_owner = d.account_owner)
   WHEN MATCHED THEN
        UPDATE SET t.account_owner = d.account_owner
END

2 个答案:

答案 0 :(得分:0)

我想我理解你的问题,但我不确定。您希望能够在一个表中更新帐户所有者名称并将此更新传播到引用表吗?

如果是这样,您实际上不需要触发器,则可以使用on update cascade外键。

像这样:

create table AccountOwner
(
    Name varchar(100) not null 
        constraint PK_AccountOwner primary key
)

create table Account
(
    AccountName varchar(100) not null,
    AccountOwnerName varchar(100) not null 
        constraint FK_Account_AccountOwnerName references AccountOwner(Name) on update cascade
)

insert AccountOwner values('Owner1')

insert Account values('Account1', 'Owner1')

现在,如果我像这样更新表AccountOwner

update AccountOwner
set Name = 'Owner2'
where Name = 'Owner1'

它会自动更新表'帐户'

select *
from Account

AccountName   AccountOwnerName
-----------   -----------------
Account1      Owner2

答案 1 :(得分:0)

我认为您需要修改表格的设计。回想一下,主键的三个属性是主键必须是

  1. 非空
  2. 唯一
  3. 不变的
  4. (如果主键由多列组成,则所有列都必须遵循上述规则)。大多数数据库强制实施#1和#2,但#3的强制执行通常由开发人员负责。

    更改主键值是关系数据库中的经典坏主意。你可能想出办法来做到这一点;这不会改变这是一个坏主意的事实。您最好的选择是在表中添加一个人工主键,在ACCOUNT_OWNER字段上放置NOT NULL和UNIQUE约束(假设是这种情况),并更改任何引用表以使用人工键。

    接下来的问题是,“更改主键值有什么坏处?”。更改主键值会更改该特定数据的唯一标识符;如果其他东西指望将原始值指向特定行,例如外键关系,则在此类更改之后,原始值将不再指向应该指向的位置。

    祝你好运。