所以我尝试在从另一个表的表中删除行之前创建备份。我做错什么了?我总是出错。
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
2条答案
按热度按时间8hhllhi21#
@userid
在您的查询中,这不是oracle的问题。此外,列名不应该用单引号括起来(用于文字字符串)。要访问即将删除的行上的值,不需要
select
从表本身(oracle和大多数其他数据库一样,无论如何都不支持表本身——这是一个著名的错误)ORA-04091 - table is mutating
). 可以使用伪表old
取而代之的是:qltillow2#
字段名周围的引号是错误的。
但是,如果要存储数据更改,则需要更好地理解触发器。如前所述,您应该查看一些伪表。在甲骨文中,它们是:新的和:旧的。
甲骨文拥有相当广泛的审计工具。更多here:https://docs.oracle.com/cd/e11882_01/server.112/e10575/tdpsg_auditing.htm#tdpsg50000
应该是这样的-