miércoles, 12 de mayo de 2010

¿Por qué no se puede validar que tipo de sequence se usa en un insert dentro de un trigger?

Dentro de los triggers solo se pueden usar los objetos relacionados con la acción, en este caso el insert maneja el new y el old (cuando se usa con el BEFORE) y estos se refieren a los valores que se mandan en el insert ej. Insert into país values(2, “Mexico”) . Por esto mismo no se puede obtener el objeto sequence por que cuando se usa en el insert como sq_pais.nextval esto es igual a un valor de tipo entero y es a lo único que podernos referenciar dentro del trigger a un numero y no al objeto sequence, que serviría para poder compara que secuencia es la que esta utilizando en el insert y si corresponde a la tabla.
Los triggers solo pueden dispararse en las siguientes acciones:

• A database manipulation (DML) statement (DELETE, INSERT, or UPDATE)
• A database definition (DDL) statement (CREATE, ALTER, or DROP)
• A database operation (SERVERERROR, LOGON, LOGOFF, STARTUP, or SHUTDOWN)


Así que no hay un trigger que pudiera dispararse cuando se uiliza un sequence o cuando se ejecuta el nextval del sequence.
Mi recomendación sería asignar el sequence dentro del trigger y no en los parámetros del insert. Ejemplo del trigger:
Insert into país(clave_cont, nombre_pais) values(2, “Mexico”);
CREATE OR REPLACE TRIGGER secuencia3
before insert on pais
for each row
begin
SELECT SEQ_PAIS.NEXTVAL INTO :NEW.clave FROM DUAL;
end;

lunes, 22 de marzo de 2010