Oracle

Trigger en tabla en Oracle

Algunas veces sucede que uno da por hecho que todo mundo sabe de lo que estamos hablando, refiriéndome a “todo mundo” por todo el equipo de trabajo de Oracle en mi actual proyecto, y mas hablando de cosas sencillas como un trigger a nivel de tabla, pero a veces resulta que no, hay cosas que uno sabe que otros no y viceversa.

Discutiendo la solución a un problema, algunos llegábamos a la conclusión de utilizar un trigger a nivel de tabla, unos estaban en contra y resulta que otros no sabían que existían, no hablare de eso, mas bien para los que no sepan, les hablare de cómo crearlos y para que sirven.

Un trigger a nivel de tabla sirve para que Oracle ejecute x o y cosa que deseemos, claro utilizando PL/SQL, al realizar algún DDL sobre una tabla (insert, delete, update) puede ser antes o después del DDL y se puede especificar una, dos o las tres acciones, incluso en la versión 11g ya se puede especificar el orden en que se desee se ejecuten los triggers, en caso de haber mas de uno sobre la misma tabla, se puede especificar si se desea la ejecución sobre cada registro procesado o que se realice por cada transacción y varias cosas mas.

La sintaxis es la siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE TRIGGER <trigger_name>
[<ENABLE | DISABLE>]
<BEFORE | AFTER> <ACTION> [OR <ACTION> OR <ACTION>]
ON <table_name>
 
DECLARE
 <variable definitions>
BEGIN
  <trigger_code>
EXCEPTION
  <EXCEPTION clauses>
END <trigger_name>;
/

Un ejemplito sencillo que ya había utilizado en un post anterior:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE TRIGGER tr_pk_employees 
  before INSERT ON employees
  FOR each ROW
DECLARE
 
BEGIN
 
  SELECT NVL(MAX(employee_id),0) + 1
    INTO :NEW.employee_id
    FROM employees;
 
END;

También podemos diferenciar la acción realizada dentro del trigger:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE OR REPLACE TRIGGER tr_pk_employees 
  before INSERT OR UPDATE OR DELETE
  ON employees
  FOR each ROW
DECLARE
 
BEGIN
 
  IF INSERTING THEN
    DBMS_OUTPUT.put_line('Inserting');
  ELSIF UPDATING THEN
    DBMS_OUTPUT.put_line('Updating');
  ELSIF DELETING THEN
    DBMS_OUTPUT.put_line('Deleting');
  END IF;
 
END;

El único detalle a destacar es que para referenciar las columnas de la tabla se utiliza el “:OLD” y el “:NEW”, por ejemplo en un “update”, “:old” tendrá el valor antes de la actualización y “:new” el valor después, en un “insert” no existe el valor “:old” y en un delete no existe el valor “:new”.

1 thought on “Trigger en tabla en Oracle

  1. hola
    tengo un problema al ahcer un trigger
    este consiste en q si un usuario supera los tres intetos de conexion el trigger se disparelo intente sobre la tabla de SYS sys.aud$ pero me dice q no se puede hacer triggersobre tablas de propios de sys
    asi q me podrias ayudar de q otra forma se podri hacer

    gracias de ante mano

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *