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:
-
Oracle Database PL/SQL Language Reference para saber mais sobre a instrução CREATE TRIGGER
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 um gatilho INSERT, OLD não contém valores e NEW contém os novos valores.
-
Para um acionador UPDATE, OLD contém os valores antigos e NEW contém os novos valores.
-
Para um acionador DELETE, OLD contém os valores antigos e NEW não contém valores.
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:
-
Crie a tabela EVALUATIONS_LOG:
CREATE TABLE EVALUATIONS_LOG ( log_date DATE , action VARCHAR2(50)); -
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:
-
No quadro Conexões, expanda hr_conn.
-
Na lista de tipos de objeto de esquema, clique com o botão direito do mouse em Triggers.
-
Na lista de opções, selecione Novo Trigger.
-
Na janela Criar Trigger:
-
No campo Nome, digite
NEW_EVALUATION_TRIGGERno valor padrão TRIGGER1. -
Para Objeto Base, selecione AVALIAÇÕES no menu.
-
Mova INSERIR de Eventos Disponíveis para Eventos Selecionados.
(Selecione INSERT e selecione >.)
-
Desmarque a opção Nível do Demonstrativo.
-
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.
-
-
Na instrução CREATE TRIGGER, substitua NULL pelo seguinte texto:
:NEW.evaluation_id := evaluations_sequence.NEXTVAL -
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:
-
Referência de Linguagem PL/SQL do Oracle Database para mais informações sobre triggers INSTEAD OF
-
Referência da Linguagem PL/SQL do Oracle Database para mais informações sobre o OLD e o NOVO
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:
-
Crie a tabela HR_USERS_LOG:
CREATE TABLE hr_users_log ( user_name VARCHAR2(30), activity VARCHAR2(20), event_date DATE ); -
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; -
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