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