首页 > 解决方案 > SQL 更新后触发器混淆

问题描述

我希望有一个人可以帮助我。这是我的第一篇文章,所以我希望我能解释清楚。

我正在使用 Microsoft SQL 管理工作室。

我正在尝试制作一个触发器,如果​​该人没有在我制作的数据库中返回计算机,则不允许任何人更改该人的个人号码。

因此,我正在为具有 ID_Person 主键、Name、Surname 和 Personal_numb 的表 Person 制作触发器。另外,我创建了一个名为 Renting 的表,其中包含以下列:ID_Renting 主键、ID_Person 外键、ID_Computer 外键以及 Date_Rented 和 Date_Returned 列。这是我的代码的样子:

create trigger NO
On Person
after update
as
 begin
 if update(Personal_numb)
 
 (select ID_Person from Renting
 where Renting.Date_Returned is null)
 begin
 Raiserror('Person needs to return the computer before you try to change their personal number!', 16,1)
 end
 end

但是,我知道我在 if update(Personal_numb) 和 select 之间遗漏了一些东西,但它是什么?

标签: sqlsql-servertriggers

解决方案


你可以试试这样的

drop trigger if exists trg_Person_upd;
go
create trigger trg_Person_upd on Person
after update
as
set nocount on;

if exists(select * from inserted);
    begin
         if exists (select * 
                    from Renting r
                         join inserted i on r.ID_Person=i.ID_Person
                         join deleted d on r.ID_Person=d.ID_Person
                    where i.Personal_numb<>d.Personal_numb
                          and r.Date_Returned is null))
        throw 50000, 'Person needs to return the computer before you try to change their personal number!', 1;
     end

推荐阅读