Trigger:evitar mais de um mesmo cadastro

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
ROGERIO.RIOS
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Ter, 26 Ago 2008 4:07 pm
Localização: CAMPOS DOS GOYTACAZES-RJ

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
Avatar do usuário
Toad
Rank: DBA Pleno
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

Não testei, mas vê se essa trigger funciona:

Selecionar tudo

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;
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.
Avatar do usuário
fsitja
Rank: OraSauro
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

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:
Declarative 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.
http://download.oracle.com/docs/cd/B105 ... g13trg.htm

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.
Avatar do usuário
fsitja
Rank: OraSauro
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

complementando:
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.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante