Sou novato em PL/SQL. Estou fazendo trabalho de POS GRADUCAO e preciso de um exemplo de TRIGGER de acordo com o meu BANCO. então pensei em fazer uma simples. Queria que fosse emcima das tabelas TBPROFESSOR e TBAREA ( matematica,fisica,quimica, biologia,etc). Cada professor só pode ser habilitado em 1 ÁREA. então tenho uma chave estrangeira FK na tabela professor ( quem vem de TBAREA )
TBPROFESSOR
ncodprof (PK)
cnomeprof
ncodarea (FK)
TBAREA
ncodarea (PK)
cnomearea
Como fazer um TRIGGER que no INSERT da tabela professor só permita a INSERÇÃO, caso não exista um registro (na tabela TBPROFESSOR )com o mesmo codigo da área (Ncodarea) ?
Insert Into (ncodarea, cnomeprof) values (22,'Rogerio Rios'), se já existir um registro como o ncodarea = 22, eu não faço o insert.
Desde já,Agradeço Muito
Trigger:evitar mais de um mesmo cadastro
-
- Rank: Estagiário Júnior
- Mensagens: 2
- Registrado em: Ter, 26 Ago 2008 4:07 pm
- Localização: CAMPOS DOS GOYTACAZES-RJ
- Toad
- Rank: DBA Pleno
- Mensagens: 253
- Registrado em: Sex, 18 Nov 2005 2:14 pm
- Localização: Seattle, WA
- Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c
matheus.dev
twitter.com/developer__c
Não testei, mas vê se essa trigger funciona:
Lembre-se que uma Trigger BEFORE UPDATE também deverá ser criada fazendo a mesma validação, senão ele cria corretamente e pode atualizar para algo errado.
Se funcionar, posta aqui confirmando por favor!
Abraços.
CREATE OR REPLACE TRIGGER TRG_VALIDA_AREA
BEFORE INSERT ON TBPROFESSOR
DECLARE
CdArea VARCHAR2(50); -- OU O TIPO DO CAMPO;
CURSOR V_AREA IS
SELECT ncodarea FROM TBPROFESSOR
WHERE ncodarea = :new.ncodarea
AND ncodprof = :new.ncodprof;
BEGIN
OPEN V_AREA;
FETCH V_AREA INTO CdArea;
IF V_AREA%FOUND THEN
RAISE_APPLICATION_ERROR (-20500,'Área já cadastrada para esse professor.');
end if;
CLOSE V_AREA;
END;
Se funcionar, posta aqui confirmando por favor!
Abraços.
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Só como observação, recomenda-se o uso de triggers para validação de restrições nos dados apenas nos casos em que restrições de integridade não possam ser criadas.
Pelo que entendi, você poderia criar uma unique key na coluna "ncodarea", o que garantiria um estado consistente do seu banco de dados de forma mais segura e eficiente do que através de trigger.
Parafraseando a documentação da Oracle:
Ou seja, a trigger garante apenas que a transação de insert não permitirá entrada de outra linha violando a regra. Porém, a unique key garante que nunca haverá outra linha com o mesmo valor para a coluna. Não há como driblar.
Pelo que entendi, você poderia criar uma unique key na coluna "ncodarea", o que garantiria um estado consistente do seu banco de dados de forma mais segura e eficiente do que através de trigger.
Parafraseando a documentação da Oracle:
http://download.oracle.com/docs/cd/B105 ... g13trg.htmDeclarative integrity constraints are statements about the database that are always true. A constraint applies to existing data in the table and any statement that manipulates the table.
Triggers constrain what a transaction can do. A trigger does not apply to data loaded before the definition of the trigger; therefore, it is not known if all data in a table conforms to the rules established by an associated trigger.
Ou seja, a trigger garante apenas que a transação de insert não permitirá entrada de outra linha violando a regra. Porém, a unique key garante que nunca haverá outra linha com o mesmo valor para a coluna. Não há como driblar.
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
complementando:
http://download.oracle.com/docs/cd/B193 ... #sthref226
http://download.oracle.com/docs/cd/B193 ... #sthref226
Database triggers let you define and enforce integrity rules, but a database trigger is not the same as an integrity constraint. Among other things, a database trigger does not check data already loaded into a table. Therefore, it is strongly recommended that you use database triggers only when the integrity rule cannot be enforced by integrity constraints.
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante