错误,触发器而不是无效,并且重新验证失败



我尝试创建一个而不是触发器。它的目的是插入3个表,而不是我的视图,但我有一系列问题。

Create or replace trigger trigg_view
Instead of Insert ON Carti_Beletristica
for each row
Begin
dbms_output.put_line('i dont know');
End;

这是我想要开始的非常基本的代码。它让我创建它,但当我尝试在我的视图中插入(Carti_Electroistica(时,我会得到下一个错误

ORA-04098: trigger 'RO_A372_SQL_S20.INSERT_VIEW_TRIGG' is invalid and failed re-validation

这非常令人沮丧,因为这是一个非常简单的触发,我无法继续。。。之后,我将如何生成去主键?因为在我看来,我没有那样的东西。我的想法是从表中的主键中选择最大值,然后添加一个,然后使用这个值,但我遇到了很多错误。

CREATE VIEW Carti_Beletristica AS
SELECT titlu, nr_pagini, nr_exemplare, nume AS autor, telefon
FROM Carte NATURAL JOIN Autor JOIN Persoana ON (id_pers = id_aut)
WHERE upper(gen) = 'BELETRISTICA'

这就是观点。

Create table Persoana(
id_pers number(10) not null,
nume varchar2(100) not null,
telefon varchar2(15) not null,
Constraint persoana_id_pers_pk primary key(id_pers)
);
Create table Carte(
id_carte number(10) not null,
titlu varchar2(100) not null,
nr_pagini number(10) not null,
nr_exemplare number(10) not null,
gen varchar2(20) not null,
Constraint carte_id_carte_pk primary key(id_carte)  
);
Create table Autor(
id_carte number(10) not null,
id_aut number(10) not null,
Constraint autor_pk primary key(id_carte,id_aut),
Constraint autor_id_carte_fk foreign key(id_carte) references Carte(id_carte),
Constraint autor_id_aut_fk foreign key(id_aut) references Persoana(id_pers)

);

你能帮我一下吗?视图上的插入看起来像

Insert into Carti_Beletristica(titlu,nr_pagini,nr_exemplare,autor,telefon)
values('tiltu',69,96,'otor','07phonenumber')

编辑:

这就是我尝试的主密钥

Create or replace trigger trigg_view
Instead of Insert ON Carti_Beletristica
for each row
declare
aux persoana.id_pers%type;
Begin
select max(id_pers)+1 into aux from Persoana;
dbms_output.put_line(aux);
End;

我的想法是从表中的主键中选择最大值,然后添加一个,然后使用这个值,

你可能会认为"我的想法奏效了",但这是非常糟糕的做法:

select max(id_pers)+1 into aux from Persoana;

这是一种获取主键标识符的低效方法。更重要的是,它是不安全的,因为它在多用户环境中不起作用:两个用户同时插入该表将派生出相同的"下一个值"(由于读取-提交隔离(,然后其中一个用户在提交事务时将获得重复密钥冲突。

正确的解决方案是使用Oracle内置的唯一密钥生成器。在12c之前,这意味着一个序列。对于persoana表,这意味着创建一个名为persoana_seq的序列,您将在触发器中引用为:

aux := persoana_seq.nextval;

序列是生成一系列保证唯一数的最具性能的机制。

在Oracle12c中,我们可以将列定义为IDENTITY列。这为我们提供了一个自动递增列:

create table persoana (
id generated always as identity primary key,
....

persoana.id将在插入时自动填充一个唯一的值,而无需我们采取任何进一步的操作。(身份栏的封面下有相关的序列,只是我们不需要担心它们。(

最新更新