Las restricciones son declaraciones de condiciones sobre la base de datos que debe permanecer verdaderas. stas incluyen restricciones basado en atributos, en tuplas, en llaves, y restricciones de integridad de referencial. El sistema inspecciona la violacin de las restricciones sobre acciones que pueden causar una violacin, y aborta la accin de acuerdo con lo especificado en la restriccin. La informacin sobre las restricciones del SQL puede encontrarse en el libro de texto. La implementacin de restricciones en Oracle difiere del standard SQL, ver documento [1] Los disparadores (o triggers) son una estructura especial del PL/SQL similar a los procedimientos. Sin embargo, un procedimiento se ejecuta explcitamente desde otro bloque va un procedimiento de llamado, mientras un disparador se ejecuta implcitamente siempre que el evento activando ocurra. El evento que activa el disparador es una orden de INSERCIN (INSERT), de BORRADO (DELETE), o de ACTUALIZACION (UPDATE). La eleccin del momento adecuado o puede ser ANTES o DESPUS DE (BEFORE o AFTER). El trigger puede estar definido a nivel de fila o de instruccin, donde los primeros realizan la accin una vez para cada fila afectada en el evento y los segundos realizan la accin una vez por toda la instruccin.
Restricciones: Difiriendo la comprobacin de una restriccin Violacin de una Restriccin Triggers: Sintaxis Bsica de un Trigger Ejemplo de Trigger Desplegando la Definicin de Errores en el Trigger Viendo los Triggers Definidos Borrando Triggers Desactivando Triggers Abortando Triggers con Error Mutating Table Errors
esquema SQL. Primero, creamos el Pollo sin las declaraciones de llave fornea: CREATE TABLE Pollo (polloID INT PRIMARY KEY, huevoID INT); CREATE TABLE Huevo (huevoID INT PRIMARY KEY, polloID INT); Luego adicionamos las restricciones de llave fornea: ALTER TABLE Pollo ADD CONSTRAINT polloREFHuevo FOREIGN KEY (huevoID) REFERENCES Huevo (huevoID) INITIALLY DEFERRED DEFERRABLE; ALTER TABLE Huevo ADD CONSTRAINT huevoREFPollo FOREIGN KEY (polloID) REFERENCES Pollo (polloID) INITIALLY DEFERRED DEFERRABLE; INITIALLY DEFERRED DEFERRABLE le dice a Oracle que haga la comprobacin de restriccin diferida. Por ejemplo, para insertar (1, 2) en el pollo y (2, 1) en el huevo, nosotros usamos: INSERT INTO Pollo VALUES(1, 2); INSERT INTO Huevo VALUES(2, 1); COMMIT; Dado que hemos declarado las restricciones de llave fornea como "diferidas", ellos slo se verifican en el punto de Commit. (Sin diferir la verificacin de la restriccin, nosotros no podemos insertar nada en las tablas Pollo y Huevo, porque el primer INSERT siempre viola la restriccin). Finalmente, para borrar las tablas, primero tenemos que borrar las restricciones, porque Oracle no permite borrar una tabla que esta siendo referenciada por otra tabla. ALTER TABLE Huevo DROP CONSTRAINT huevoREFPollo; ALTER TABLE Pollo DROP CONSTRAINT polloREFHuevo; DROP TABLE Huevo; DROP TABLE Pollo;
Para ms detalles sobre cmo es el manejo de errores, por favor eche una mirada al tratamiento de errores de Pro*C o a la seccin de las Recuperando Excepciones de tratamiento de errores de JDBC.
Si se especifica la opcin FOR EACH ROW, el trigger es a nivel de fila; De otra forma el trigger ser a nivel de instruccin.. Slo para triggers a nivel de fila: Las variables especiales NEW y OLD estn disponibles para referirse respectivamente a las tuples nueva y vieja. Nota: En el cuerpo del disparador, NEW y OLD deben ser precedidos por dos puntos (":"), pero en la clusula WHEN, ellos no tienen los dos puntos precedentes! Vea el ejemplo debajo. La clusula REFERENCING puede ser usada para asignar alias a las variables NEW y OLD. Una restriccin trigger puede ser especificada en la clusula WHEN, encerrada entre parntesis. La restriccin del disparador es una condicin SQL que debe satisfacerse para que Oracle dispare el trigger. Esta condicin no puede contener subconsultas. Sin la clusula WHEN, el trigger se dispara para cada fila. El <Cuerpo_Del_Trigger> es un bloque PL/SQL, en lugar de una secuencia de instrucciones SQL. Oracle ha puesto ciertas restricciones sobre lo que usted puede hacer en el <Cuerpo_Del_Trigger>, para evitar situaciones dnde un disparador realiza una accin que activa un segundo trigger que entonces activa un tercero que podra crear, potencialmente, una vuelta infinita y as sucesivamente. Las restricciones sobre el <Cuerpo_Del_Trigger> incluyen:
Usted no puede modificar la misma relacin cuya modificacin es el evento que activa el disparador. Usted no puede modificar una relacin conectada a la relacin del disparador por otra restriccin como una llave fornea.
Ejemplo de Trigger
Nosotros ilustramos la sintaxis de Oracle por crear un disparador a travs de un ejemplo basado en las siguiente dos tablas: CREATE TABLE TA (a INTEGER, b CHAR(10)); CREATE TABLE TB (c CHAR(10), d INTEGER); Nosotros creamos un disparador que puede insertar un tupla en TB cuando un tupla se inserta en TA. Especficamente, el disparador verifica si la nueva tupla tiene un primer componente 10 o menos, y en ese caso inserta la tupla inversa en TB:
CREATE TRIGGER dispara1 AFTER INSERT ON TA REFERENCING NEW AS nuevaFila FOR EACH ROW WHEN (nuevaFila.a <= 10) BEGIN INSERT INTO TB VALUES(:nuevaFila.b, : nuevaFila.a); END dispara1; . run; Note que la instruccin CREATE TRIGGER la finalizamos con punto y run, como en todas las declaraciones de PL/SQL. La ejecucin de la instruccin CREATE TRIGGER solo crea el trigger, no lo ejecuta. Slo un evento de activacin, como una insercin en TA (para este ejemplo), causa que el trigger se ejecute.
Borrando Triggers
Para borrar un trigger ejecuto la instruccin: drop trigger <Nombre_Trigger>;
Desactivando Triggers
Para desactivar o activar un trigger: alter trigger <Nombre_Trigger> {disable|enable};
Referencias
[1] http://www-db.stanford.edu/~ullman/fcdb/oracle/or-nonstandard.html#constraints