我想创建一个触发器,它并不如他的名字删除客户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)
您有两个选择:
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)
哪一个最适合您在很大程度上取决于您的业务逻辑。
| 归档时间: |
|
| 查看次数: |
42004 次 |
| 最近记录: |