【问题标题】:t-sql INSTEAD OF deleting a row PRINT its idt-sql INSTEAD OF 删除一行 PRINT its id
【发布时间】:2021-12-24 12:06:36
【问题描述】:

是否可以在您尝试删除行时运行这样的触发器并打印如下内容:“尝试删除行 ROW_ID”,而不是实际删除行?

UPD:谢谢。为我工作:

GO
CREATE OR ALTER TRIGGER Trigger_2 ON Authors
INSTEAD OF DELETE
AS BEGIN
    DECLARE @deleted_id INT;
    DECLARE cursor_deleted CURSOR
    FOR SELECT au_id FROM deleted;

    OPEN cursor_deleted;
    FETCH NEXT FROM cursor_deleted INTO @deleted_id;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT('Attempting to delete author ' + STR(@deleted_id));
        FETCH NEXT FROM cursor_deleted INTO @deleted_id;
    END;

    CLOSE cursor_deleted;
    DEALLOCATE cursor_deleted;
END;

GO
DELETE FROM Authors WHERE au_id BETWEEN 1 AND 10;

【问题讨论】:

  • 触发器绝不应该尝试使用 PRINT 与生产环境中的进程或用户进行通信。简单地“忽略”插入行的尝试是一种冒险的设计。尝试此插入的进程只会知道它正常工作,并将根据该“知识”继续执行。

标签: sql-server tsql triggers


【解决方案1】:

是的,有很多方法。 使用触发器,您可以将触发器设置为在删除后运行,并且您必须使用“ROLLBACK”来撤消删除操作。 或者只是简单地使用 INSTEAD OF where 顾名思义,触发器将替换 who 删除操作。 希望这对您有所帮助。 ps:删除操作后,删除的数据存储在名为“deleted”的全局表中,用于获取您需要的任何数据或元数据。

 CREATE TRIGGER schema_name.trigger_name
    ON table_name
     // this trigger is executed instead of any deletion
    INSTEAD OF DELETE
    AS
     BEGIN
       // return the one to be deleted's id. 
       return deleted.id
     END

【讨论】:

    猜你喜欢
    • 2014-11-11
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多