triggers

mireya
19 de Septiembre del 2004
hola necesito saber todo sobre trigger de base de datos
驴Cuales son los eventos que maneja un trigger de base de datos?

Escriba 2 ejemplos de triggers con eventos de lenguaje de manipulaci贸n de datos.

驴Cuales restricciones existen en la escritura de triggers?


vmarquez
19 de Septiembre del 2004
basicamente se ejecutan con eventos transaccionales dml en la base de datos, su fnalidad es complementar eventos involucrados sin que intervengas eventos OLAP implicitos

no existe rstriccion alguna, hay que involucrar que objetos disparen los triggers

esto es un ejemplo de como involucrar otras tablas cuando se hacen instrucciones dml de una tabla


CREATE OR REPLACE TRIGGER ar_corporate_intco_trg
AFTER DELETE OR INSERT OR UPDATE ON ar_corporate_interface FOR EACH ROW

DECLARE
V_NUMERO NUMBER;

BEGIN
IF INSERTING THEN

INSERT INTO ar_corporate_interface_hist (
ADDRESS_REF ,NOMBRE_CLIENTE ,ADDRESS1 ,CITY
,INVOICE_NUMBER ,BILLING_DATE ,AMOUNT ,LINE_DESCRIPTION
,HEADER_DESCRIPTION ,CURRENCY_CODE ,RATE_TYPE ,RATE_DATE
,EXCHANGE_RATE ,TRANSACTION_SOURCE ,TRANSACTION_TYPE ,SEGMENT1
,SEGMENT2 ,BILLING_PERIOD ,CONTRACT_NUMBER ,USER_NAME
,AGREEMENT_NUMBER ,CREDIT_CARD ,INTERNAL_CONTROL ,UF
,FORMA_PAGO ,ITEM_TYPE ,PRICE ,QUANTITY
,PAIS ,ACTION ,ACTION_DATE )
values (
:NEW.ADDRESS_REF ,:NEW.NOMBRE_CLIENTE ,:NEW.ADDRESS1 ,:NEW.CITY
,:NEW.INVOICE_NUMBER ,:NEW.BILLING_DATE ,:NEW.AMOUNT ,:NEW.LINE_DESCRIPTION
,:NEW.HEADER_DESCRIPTION ,:NEW.CURRENCY_CODE ,:NEW.RATE_TYPE ,:NEW.RATE_DATE
,:NEW.EXCHANGE_RATE ,:NEW.TRANSACTION_SOURCE ,:NEW.TRANSACTION_TYPE ,:NEW.SEGMENT1
,:NEW.SEGMENT2 ,:NEW.BILLING_PERIOD ,:NEW.CONTRACT_NUMBER ,:NEW.USER_NAME
,:NEW.AGREEMENT_NUMBER ,:NEW.CREDIT_CARD ,:NEW.INTERNAL_CONTROL ,:NEW.UF
,:NEW.FORMA_PAGO ,:NEW.ITEM_TYPE ,:NEW.PRICE ,:NEW.QUANTITY
,:NEW.PAIS ,'CREATED RECORD' ,TRUNC(SYSDATE));

ELSIF DELETING THEN

INSERT INTO ar_corporate_interface_hist (
ADDRESS_REF ,NOMBRE_CLIENTE ,ADDRESS1 ,CITY
,INVOICE_NUMBER ,BILLING_DATE ,AMOUNT ,LINE_DESCRIPTION
,HEADER_DESCRIPTION ,CURRENCY_CODE ,RATE_TYPE ,RATE_DATE
,EXCHANGE_RATE ,TRANSACTION_SOURCE ,TRANSACTION_TYPE ,SEGMENT1
,SEGMENT2 ,BILLING_PERIOD ,CONTRACT_NUMBER ,USER_NAME
,AGREEMENT_NUMBER ,CREDIT_CARD ,INTERNAL_CONTROL ,UF
,FORMA_PAGO ,ITEM_TYPE ,PRICE ,QUANTITY
,PAIS ,ACTION ,ACTION_DATE )
values (
:OLD.ADDRESS_REF ,:OLD.NOMBRE_CLIENTE ,:OLD.ADDRESS1 ,:OLD.CITY
,:OLD.INVOICE_NUMBER ,:OLD.BILLING_DATE ,:OLD.AMOUNT ,:OLD.LINE_DESCRIPTION
,:OLD.HEADER_DESCRIPTION ,:OLD.CURRENCY_CODE ,:OLD.RATE_TYPE ,:OLD.RATE_DATE
,:OLD.EXCHANGE_RATE ,:OLD.TRANSACTION_SOURCE ,:OLD.TRANSACTION_TYPE ,:OLD.SEGMENT1
,:OLD.SEGMENT2 ,:OLD.BILLING_PERIOD ,:OLD.CONTRACT_NUMBER ,:OLD.USER_NAME
,:OLD.AGREEMENT_NUMBER ,:OLD.CREDIT_CARD ,:OLD.INTERNAL_CONTROL ,:OLD.UF
,:OLD.FORMA_PAGO ,:OLD.ITEM_TYPE ,:OLD.PRICE ,:OLD.QUANTITY
,:OLD.PAIS ,'DELETED RECORD' ,TRUNC(SYSDATE));

ELSIF UPDATING THEN

INSERT INTO ar_corporate_interface_hist (
ADDRESS_REF ,NOMBRE_CLIENTE ,ADDRESS1 ,CITY
,INVOICE_NUMBER ,BILLING_DATE ,AMOUNT ,LINE_DESCRIPTION
,HEADER_DESCRIPTION ,CURRENCY_CODE ,RATE_TYPE ,RATE_DATE
,EXCHANGE_RATE ,TRANSACTION_SOURCE ,TRANSACTION_TYPE ,SEGMENT1
,SEGMENT2 ,BILLING_PERIOD ,CONTRACT_NUMBER ,USER_NAME
,AGREEMENT_NUMBER ,CREDIT_CARD ,INTERNAL_CONTROL ,UF
,FORMA_PAGO ,ITEM_TYPE ,PRICE ,QUANTITY
,PAIS ,ACTION ,ACTION_DATE )
values (
:OLD.ADDRESS_REF ,:OLD.NOMBRE_CLIENTE ,:OLD.ADDRESS1 ,:OLD.CITY
,:OLD.INVOICE_NUMBER ,:OLD.BILLING_DATE ,:OLD.AMOUNT ,:OLD.LINE_DESCRIPTION
,:OLD.HEADER_DESCRIPTION ,:OLD.CURRENCY_CODE ,:OLD.RATE_TYPE ,:OLD.RATE_DATE
,:OLD.EXCHANGE_RATE ,:OLD.TRANSACTION_SOURCE ,:OLD.TRANSACTION_TYPE ,:OLD.SEGMENT1
,:OLD.SEGMENT2 ,:OLD.BILLING_PERIOD ,:OLD.CONTRACT_NUMBER ,:OLD.USER_NAME
,:OLD.AGREEMENT_NUMBER ,:OLD.CREDIT_CARD ,:OLD.INTERNAL_CONTROL ,:OLD.UF
,:OLD.FORMA_PAGO ,:OLD.ITEM_TYPE ,:OLD.PRICE ,:OLD.QUANTITY
,:OLD.PAIS ,'UPDATED RECORD' ,TRUNC(SYSDATE));

END IF;
END;

Jorge-DBA
19 de Septiembre del 2004
Hola Mirella

Un Trigger o en espa帽ol "Disparador", es un objeto de la base de datos que su objetivo principal es realizar un acci贸n de sentencia en un determinado evento o condici贸n en la base de datos por medio de un Store PL/SQL asociado a la tabla.

Tu puedes deshabilitar o habilitar un Trigger una vez creado en la base de datos.

Para poder crear un trigger necesitas primeramente el privilegio de sistema "CREATE TRIGGER" o bien el Role de RESOURCE y para poder deshabilitar o habilitar triggers necesitas el privilegio ALTER ANY TRIGGER .

Cuando creas un Trigger puedes crearlo con los siguinetes par谩metros:

Before, AfterInstead of, dml_event_clause, ddl_event, database_event, on TABLE/VIEW, referencing_clause, WHEN, pl/sql_block

EJEMPLO:

CREATE TRIGGER scott.salary_check
BEFORE
INSERT OR UPDATE OF sal, job ON scott.emp
FOR EACH ROW
WHEN (new.job <> 'PRESIDENT')
pl/sql_block

La docuementaci贸n te la mando a tu correo,

Espero que te sirva la informaci贸n
Saludos Mirella
Jorge-DBA

Kothvandir
19 de Septiembre del 2004
Hola,

Quiz谩s ya sea un poco tarde pero espero que a煤n te sirva:

Las restricciones para la creaci贸n de triggers de tipo DDL son:
- Un disparador no puede ejecutar sentencias relativas al control de de transacciones: COMMIT, ROLLBACK O SAVEPOINT, ni llamar a procedimientos o funciones que lo hagan
- No pueden ejecutar sentencias DDL
- Para los triggers de nivel de fila o a nivel de instrucci贸n si se ejecuta un DELETE ON CASCADE:
* No pueden leer o modificar tablas mutantes de la orden que provoc贸 el disparo del trigger o la suya propia
* No se puede leer o modificar columnas de claves primarias o referenciales de las tablas que est茅n asociadas a la tabla del trigger mediante integridad referencial (tablas de restricci贸n)

Una tabla mutante es una tabla que est谩 siendo modificada por una instrucci贸n INSERT, DELETE o UPDATE o afectada por un DELETE ON CASCADE, o aquellas sobre las que se define un trigger.

Espero que te sirva