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 neste documento, o esquema de amostra hr deve ser instalado e você deve estar conectado ao banco de dados 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 AI Database para obter mais informações sobre 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 após a instrução de trigger ser executada e usa os predicados condicionais INSERIR, ATUALIZAR e DELETING para determinar qual 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 AI Database para obter 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.

Para criar o trigger 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, clique em Novo Trigger.

  4. Na janela Criar Trigger:

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

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

    3. Mover INSERT de Eventos Disponíveis para Eventos Selecionados.

      (Selecione INSERT e clique em >.)

    4. Desmarque a opção Nível de instrução.

    5. Clique em 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 por este:

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

    O banco de dados compila o procedimento e salva-o. 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.

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;

Consulte Também: Referência de Linguagem PL/SQL do Oracle AI Database para obter mais informações sobre triggers do sistema