2011-06-04 44 views
0

我有一个帐户所有者作为主键的帐户表。在更新触发器中,我想更新一些帐户给新的所有者。由于此表没有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 
+0

创建表帐户 – mwok 2011-06-04 21:23:06

+1

可以显示:1.帐户表的结构。 2.表格的样本内容; 3.什么更新查询你的跑步; 4.运行此查询后您期望得到什么结果。 – 2011-06-04 21:43:35

回答

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 
0

我想你需要修改你的桌子的设计。回想一下,一个主键的三个属性是主键必须是

  1. 非空
  2. 独特
  3. 不变的

(如果主键由多个列中,所有列必须遵循上面的规则)。大多数数据库执行#1和#2,但是#3的执行通常是由开发人员决定的。

更改主键值是关系数据库中经典的错误主意。你可以想出办法做到这一点;这并没有改变这是一个坏主意的事实。你最好的选择是在你的表中添加一个人为的主键,并在ACCOUNT_OWNER字段中放置NOT NULL和UNIQUE约束(假设情况如此),并将所有引用表修改为使用人工键。

接下来的问题是,“改变主键值有什么不好?”。更改主键值会更改该特定数据的唯一标识符;如果别的东西指望将原始值指向特定的行(例如外键关系),那么在这样的改变之后,原始值将不再指向它应该指向的位置。

祝你好运。