【问题标题】:Trigger to prevent Any Deleting from Table触发以防止从表中删除任何内容
【发布时间】:2017-06-17 07:50:01
【问题描述】:

这个新的租赁历史表的触发器,防止从表中删除。

CREATE OR REPLACE  TRIGGER RENTALHIS_DEL
BEFORE DELETE ON RENTALHISTORY
BEGIN
dbms_output.put_line( 'Records can not be deleted');
END;

DELETE FROM RENTALHISTORY WHERE RENTALID = 1;



-- It is deleting before it says it can not delete

1 rows deleted.

Records can not be deleted

【问题讨论】:

标签: sql oracle triggers


【解决方案1】:
dbms_output.put_line( 'Records can not be deleted');

上面只是打印文本和触发器成功完成,然后删除无论如何都会发生。您想要做的是引发错误以阻止程序完成。

使用标准程序raise_application_error 停止程序并引发错误:

CREATE OR REPLACE  TRIGGER RENTALHIS_DEL
BEFORE DELETE ON RENTALHISTORY
BEGIN
    raise_application_error(-20001,'Records can not be deleted');
END;
/

【讨论】:

    【解决方案2】:

    您想引发错误,而不是打印消息。无论如何都会删除:

    CREATE OR REPLACE  TRIGGER RENTALHIS_DEL
    BEFORE DELETE ON RENTALHISTORY
    BEGIN
      RAISE_APPLICATION_ERROR (-20000, 'Deletion not supported on this table');
    END;
    

    或者,您可以使用instead of 触发器来防止发生删除:

    CREATE OR REPLACE TRIGGER RENTALHIS_DEL
    INSTEAD OF DELETE ON RENTALHISTORY
    BEGIN
       dbms_output.put_line( 'Records cannot be deleted');
    END;
    

    【讨论】:

      【解决方案3】:

      之后您可以使用commit after your delete statement and rollback 使用Pragma 到达上一阶段。

           CREATE OR REPLACE  TRIGGER 
           RENTALHIS_DEL
          AFTER DELETE ON RENTALHISTORY
             DECLARE
             PRAGMA 
                AUTONOMOUS_TRANSACTION;
            BEGIN
            RAISE_APPLICATION_ERROR 
           (-20000, 'Deletion getting rolled 
           back');
                 ROLLBACK;
                   END;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多