Criando Triggers

Para criar acionadores, use a interface gráfica do SQL Developer ou a instrução DDL CREATE TRIGGER.

Esta seção mostra como usar essas duas formas para criar acionadores.

Por padrão, um trigger é criado no estado ativado. Para criar um TRIGGER no estado desativado, use a instrução CREATE TRIGGER com a cláusula DISABLE.

Observação: Para criar acionadores, você deve ter privilégios apropriados; no entanto, para essa discussão, você não precisa dessas informações adicionais.

Observação: Para fazer os tutoriais deste documento, você deve estar conectado ao Oracle Database como o usuário HR do SQL Developer.

Consulte também:

Sobre Pseudorregistros ANTIGOS e NOVOS

Quando um acionador no nível da linha é acionado, o sistema de runtime PL/SQL cria e preenche os dois pseudorecords OLD e NEW. Eles são chamados de pseudoregistros porque possuem algumas, mas não todas, as propriedades de registros.

Para a linha que o trigger está processando:

Para fazer referência a um pseudorecord, coloque dois-pontos antes do nome:OLD ou :NEW-como no Exemplo 6-1.

Consulte Também: Referência de Linguagem PL/SQL do Oracle Database para obter mais informações sobre os pseudorecords ANTIGOS e NOVOS

Tutorial: Criando um Trigger que Registra Alterações em Tabela

Este tutorial mostra como usar a instrução CREATE TRIGGER para criar um TRIGGER, EVAL_CHANGE_TRIGGER, que adiciona uma linha à tabela EVALUATIONS_LOG sempre que uma instrução INSERT, UPDATE ou DELETE altera a tabela EVALUATIONS.

O trigger adiciona a linha depois que a instrução de trigger é executada e usa os preditivos condicionais INSERIR , ATUALIZAÇÃO e DELETING para determinar quais das três possíveis instruções DML acionaram o trigger.

EVAL_CHANGE_TRIGGER é um trigger de nível de instrução e um trigger MAIS FORTE.

Para criar EVALUATIONS_LOG e EVAL_CHANGE_TRIGGER:

  1. Crie a tabela EVALUATIONS_LOG:

     CREATE TABLE EVALUATIONS_LOG ( log_date DATE
                                 , action VARCHAR2(50));
    
  2. Criar EVAL_CHANGE_TRIGGER:

     CREATE OR REPLACE TRIGGER EVAL_CHANGE_TRIGGER
    
       AFTER INSERT OR UPDATE OR DELETE
       ON EVALUATIONS
     DECLARE
       log_action  EVALUATIONS_LOG.action%TYPE;
     BEGIN
       IF INSERTING THEN
         log_action := 'Insert';
       ELSIF UPDATING THEN
         log_action := 'Update';
       ELSIF DELETING THEN
         log_action := 'Delete';
       ELSE
         DBMS_OUTPUT.PUT_LINE('This code is not reachable.');
       END IF;
    
       INSERT INTO EVALUATIONS_LOG (log_date, action)
         VALUES (SYSDATE, log_action);
     END;
    

Consulte também: Referência de Linguagem PL/SQL do Oracle Database para mais informações sobre predicados condicionais

Tutorial: Criando um Trigger que Gera uma Chave Primária para uma Linha Antes que Seja Informada

Este tutorial mostra como usar a ferramenta Criar Acionador do SQL Developer para criar um acionador que é acionado antes de uma linha ser inserida na tabela EVALUATIONS e gera o número exclusivo para a chave primária dessa linha, usando EVALUATIONS_SEQENCE.

A sequência EVALUATIONS_SEQUENCE (criada em "Tutorial: Criando uma Sequência") gera chaves primárias para a tabela EVALUATIONS (criada em). No entanto, essas chaves primárias não são inseridas na tabela automaticamente.

Este tutorial mostra como usar a ferramenta Criar Acionador do SQL Developer para criar um acionador chamado NEW_EVALUATION_TRIGGER, que é acionado antes de uma linha ser inserida na tabela EVALUATIONS e gera o número exclusivo para a chave primária dessa linha usando EVALUATIONS_SEQENCE. O trigger é acionado uma vez para cada linha afetada pela instrução INSERT do trigger.

NEW_EVALUATION_TRIGGER é um gatilho de nível de linha e um gatilho ANTES.

Etapas para criar o acionador NEW_EVALUATION:

  1. No quadro Conexões, expanda hr_conn.

  2. Na lista de tipos de objeto de esquema, clique com o botão direito do mouse em Triggers.

  3. Na lista de opções, selecione Novo Trigger.

  4. Na janela Criar Trigger:

    1. No campo Nome, digite NEW_EVALUATION_TRIGGER no valor padrão TRIGGER1.

    2. Para Objeto Base, selecione AVALIAÇÕES no menu.

    3. Mova INSERIR de Eventos Disponíveis para Eventos Selecionados.

      (Selecione INSERT e selecione >.)

    4. Desmarque a opção Nível do Demonstrativo.

    5. Selecione OK.

      O painel NEW_EVALUATION_TRIGGER é aberto, mostrando a instrução CREATE TRIGGER que criou o TRIGGER:

       CREATE OR REPLACE
      
       TRIGGER NEW_EVALUATION_TRIGGER
      
       BEFORE INSERT ON EVALUATIONS
      
       FOR EACH ROW
      
       BEGIN
      
         NULL;
      
       END;
      

      O título do painel NEW_EVALUATION_TRIGGER está em itálico, indicando que o trigger ainda não foi salvo no banco de dados.

  5. Na instrução CREATE TRIGGER, substitua NULL pelo seguinte texto:

     :NEW.evaluation_id := evaluations_sequence.NEXTVAL
    
  6. No menu Arquivo, selecione Salvar.

    O Oracle Database compila o procedimento e o salva. O título do painel NEW_EVALUATION_TRIGGER não fica mais na fonte em itálico.

Criando um Trigger INSTEAD OF

Uma view apresenta a saída de uma consulta como uma tabela. Se você quiser alterar uma view como alteraria uma tabela, deverá criar triggers INSTEAD OF. Em vez de alterar a view, eles alteram as tabelas subjacentes.

Por exemplo, considere a view EMP_LOCATIONS, cuja coluna NAME é criada com base nas colunas LAST_NAME e FIRST_NAME da tabela EMPLOYEES:

CREATE VIEW EMP_LOCATIONS AS
SELECT e.EMPLOYEE_ID,
  e.LAST_NAME || ', ' || e.FIRST_NAME NAME,
  d.DEPARTMENT_NAME DEPARTMENT,
  l.CITY CITY,
  c.COUNTRY_NAME COUNTRY
FROM EMPLOYEES e, DEPARTMENTS d, LOCATIONS l, COUNTRIES c
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND
 d.LOCATION_ID = l.LOCATION_ID AND
 l.COUNTRY_ID = c.COUNTRY_ID
ORDER BY LAST_NAME;

Para atualizar a VIEW EMP_LOCATIONS.NAME (criada em "Creating Views with the CREATE VIEW Statement"), atualize EMPLOYEES.LAST_NAME e EMPLOYEES.FIRST_NAME. É o que o trigger INSTEAD OF no Exemplo 6-1 faz.

NEW e OLD são pseudorecords que o mecanismo de runtime PL/SQL cria e preenche sempre que um trigger de nível de linha é acionado. ANTIGO e NOVO armazenam os valores original e novo, respectivamente, do registro que está sendo processado pelo trigger. Eles são chamados de pseudoregistros porque eles não possuem todas as propriedades dos registros PL/SQL.

Exemplo 6-1 Criando um Acionador INSTEAD OF

CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE ON emp_locations
BEGIN
  UPDATE employees SET
    first_name = substr( :NEW.name, instr( :new.name, ',' )+2),
    last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1)
  WHERE employee_id = :OLD.employee_id;
END;

Consulte também:

Tutorial: Criando Triggers que Registram Eventos de LOGON e LOGOFF

Este tutorial mostra como usar a instrução CREATE TRIGGER para criar dois triggers, HR_LOGON_TRIGGER e HR_LOGOFF_TRIGGER. Depois de alguém fazer log-on como HR do usuário, HR_LOGON_TRIGGER adiciona uma linha à tabela HR_USERS_LOG. Antes de alguém fazer log-off como usuário HR, HR_LOGOFF_TRIGGER adiciona uma linha à tabela HR_USERS_LOG.

HR_LOGON_TRIGGER e HR_LOGOFF_TRIGGER são acionadores de sistema. HR_LOGON_TRIGGER é um trigger ANTES e HR_LOGOFF_TRIGGER é um trigger ANTES.

Etapas para criar HR_USERS_LOG, HR_LOGON_TRIGGER e HR_LOGOFF_TRIGGER:

  1. Crie a tabela HR_USERS_LOG:

     CREATE TABLE hr_users_log (
       user_name VARCHAR2(30),
       activity VARCHAR2(20),
       event_date DATE
     );
    
  2. Criar HR_LOGON_TRIGGER:

     CREATE OR REPLACE TRIGGER hr_logon_trigger
    
       AFTER LOGON
    
       ON HR.SCHEMA
     BEGIN
       INSERT INTO hr_users_log (user_name, activity, event_date)
       VALUES (USER, 'LOGON', SYSDATE);
     END;
    
  3. Criar HR_LOGOFF_TRIGGER:

     CREATE OR REPLACE TRIGGER hr_logoff_trigger
    
       BEFORE LOGOFF
    
       ON HR.SCHEMA
     BEGIN
       INSERT INTO hr_users_log (user_name, activity, event_date)
       VALUES (USER, 'LOGOFF', SYSDATE);
     END;
    

Veja também: Referência de Linguagem PL/SQL do Oracle Database para mais informações sobre acionadores do sistema