Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新触发器旧值自然键_Sql_Sql Server 2008 - Fatal编程技术网

Sql 更新触发器旧值自然键

Sql 更新触发器旧值自然键,sql,sql-server-2008,Sql,Sql Server 2008,我有一个accounts表,其中account owner作为主键。在更新触发器中,我想将一些帐户更新为新的所有者。由于此表没有id字段,如何在触发器中使用插入/更新的表?DB是sql server 2008 CREATE TRIGGER accounts_change_owner on accounts AFTER INSERT AS BEGIN MERGE INTO accounts t USING ( SELECT * FROM insert

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

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

如果您真的不需要触发器,那么可以使用更新级联外键

像这样:

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'
它将自动更新表“Account”

select *
from Account

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

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

非空 唯一的 不变的 如果主键由多列组成,则所有列都必须遵循上述规则。大多数数据库执行1和2,但执行3通常由开发人员决定

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

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


祝你好运。

你能展示一下吗:1。会计表的结构。;2.表格的样本内容;3.你的跑步记录;4.运行此查询后所需的结果。