【问题标题】:Before Delete Trigger For Backup删除前备份触发器
【发布时间】:2020-10-12 20:53:42
【问题描述】:

所以我试图在从其他表的表中删除行之前创建备份。我在这里做错了什么?我不断收到插入错误。

create or replace TRIGGER test_dummy_backup_insert before delete on test_dummy
FOR EACH ROW 

begin
    insert into test_dummy_back_up ('userid', 'firstname', 'lastname','salary','location')
    select * from test_dummy where userid = @userid;
end;

错误-

DELETE FROM "PRACTICE"."TEST_DUMMY" WHERE ROWID = 'AAAE/FAAFAAAADFAAD'
AND ORA_ROWSCN = '5429140' and ( "FIRSTNAME" is null or "FIRSTNAME" is
not null ) ORA-04098: trigger 'PRACTICE.TEST_DUMMY_BACKUP_INSERT' is
invalid and failed re-validation

【问题讨论】:

    标签: sql oracle plsql sql-insert database-trigger


    【解决方案1】:

    字段名称的引号是错误的。

    但是,如果您想存储数据更改,则需要更好地了解触发器。如前所述,您应该查看一些伪表。在 oracle 中,它们是 :NEW 和 :OLD。

    Oracle 拥有相当广泛的审计工具。更多的 这里:https://docs.oracle.com/cd/E11882_01/server.112/e10575/tdpsg_auditing.htm#TDPSG50000

    应该是这样的-

    Insert into backup_table 
    (userid, firstname, lastname, salary, location)
    values(old.userid, old.firstname, old.lastname, old.salary, old.location)
    

    【讨论】:

      【解决方案2】:

      @userid 在您的查询中不适合 Oracle。此外,列名不应用单引号括起来(用于文字字符串)。

      要访问即将被删除的行上的值,您不需要从表本身 select(Oracle 和大多数其他数据库一样,无论如何都不支持 - 这是著名的错误 ORA-04091 - table is mutating )。您可以改用伪表old

      create or replace trigger test_dummy_backup_insert 
      before delete on test_dummy
      for each row 
      begin
          insert into test_dummy_back_up 
              (userid, firstname, lastname, salary, location)
          values(old.userid, old.firstname, old.lastname, old.salary, old.location)
      end;
      

      【讨论】:

        猜你喜欢
        • 2018-12-15
        • 2022-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 2010-12-29
        • 2021-02-01
        相关资源
        最近更新 更多