SQL Server:触发器 FOR DELETE

1 trigger sql-server delete

我想创建一个触发器,它并不如他的名字删除客户Peter。我怎样才能做到这一点?

CREATE TRIGGER trgCUSTOMER ON customer
FOR DELETE
AS
BEGIN
    IF (SELECT name FROM deleted) not like 'Peter'
    BEGIN
        delete from customer where name = (select name from deleted);
    END
END;
Run Code Online (Sandbox Code Playgroud)

spa*_*dba 5

您有两个选择:

1) 回滚 DELETE,以防您要删除行“Peter”。您可以使用 AFTER 触发器执行此操作。请注意,如果您要删除多行,其中至少有一个是“Peter”,它将回滚整个事务。

CREATE TRIGGER TR_CUSTOMER_DEL ON customer
FOR DELETE
AS
BEGIN

    SET NOCOUNT ON;

    IF EXISTS (
        SELECT *
        FROM deleted
        WHERE name = 'Peter'
    )
    BEGIN
        ROLLBACK;
        THROW 50001, 'Cannot delete Peter', 1;
    END
END;
Run Code Online (Sandbox Code Playgroud)

2) 您使用 INSTEAD OF 触发器覆盖 SQL Server 对表执行 DELETE 的方式。在这种情况下,您会默默地忽略“Peter”行的 DELETE。

CREATE TRIGGER TR_CUSTOMER_IO_DEL ON customer
INSTEAD OF DELETE
AS
BEGIN

    SET NOCOUNT ON;

    DELETE c
    FROM customer AS c
    INNER JOIN deleted AS d
        ON c.customer_id = d.customer_id
    WHERE d.name <> 'Peter';

END;
Run Code Online (Sandbox Code Playgroud)

哪一个最适合您在很大程度上取决于您的业务逻辑。