Sql 更新触发器旧值自然键
我有一个accounts表,其中account owner作为主键。在更新触发器中,我想将一些帐户更新为新的所有者。由于此表没有id字段,如何在触发器中使用插入/更新的表?DB是sql server 2008Sql 更新触发器旧值自然键,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
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.运行此查询后所需的结果。