Sei sulla pagina 1di 17

Expresiones Join SQL2

En SQL2 hay varias clases de operadores Join disponibles.


Las expresiones Join, al producir relaciones, pueden ser usadas
en la cláusula FROM de una expresión Seleccione-De-Cuando.
La forma más simple de expresión Join es el CROOSJOIN,
término sinónimo del producto cartesiano. Por ejemplo, si
queremos realizar el producto de dos relaciones:
Películas (titulo, año, longitud, tipo, estudio)
Estrellas (tituloPelicula, añoPelicula, nombreActor)
Podemos hacerlo asi:
Películas CROOSJOIN Estrellas;
Suponga que deseo unir las relaciones Películas y Estrellas con la
condición de unir solo aquellas tuplas que se refieran a la misma
película. Es decir, que tituloPelicula y año deben ser el mismo.

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 1/34

Expresiones Join SQL2


El resultado puede ser:
Películas JOIN Estrellas ON
titulo = tituloPelicula AND año = añoPelicula;

El resultado es una relacion de ocho columnas con los mismos


atributos del CROOSJOIN donde las tuplas resultantes
provienen de aquellas tuplas de Películas y Estrellas que al
combinarlas coincidan en el titulo y el año de la película.
Cuando una expresión Join aparece en una cláusula FROM, la
relación denotada por la expresión Join es tratada como una
tabla base o una vista en la cláusula FROM.
Ejemplo: Si consideramos que el ejemplo anterior tiene dos
componentes redundantes, toda la expresión del ejemplo se
pueden colocar en la cláusula FROM y usar una cláusula
SELECT para remover los atributos no deseados:
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 2/34

1
Expresiones Join SQL2
SELECT titulo, año, longitud, tipo, estudio, nombreActor
FROM Películas JOIN Estrellas ON
Titulo = tituloPelicula AND año = añoPelícula ;

JOIN NATURAL EN SQL2


Como se recuerda el Join natural difiere del Join theta en:
1. La condición join es que todos los atributos que se emparejan,
de las dos relaciones tienen un nombre comun que se iguala,
y no hay otras condiciones.
2.Uno solo de los atributos que se igualan son proyectados.

SQL2 funciona exactamente así, la palabra clave NATURAL


JOIN debe aparecer entre las relaciones para expresar el
operador ⊲⊳ .

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 3/34

Expresiones Join SQL2


Ejemplo: se quiere calcular el join natural de las relaciones:
EstrellasPelicula (nombre, dirección, sexo, fechaNacmto)
EjecutivosCine (nombre, dirección, codProductor, ingresoNeto)
La consulta será:
EstrellasPelicula NATURAL JOIN EjecutivosCine ;

OUTERJOIN EN SQL2
Al calcular el join R ⊲⊳ S, si una tupla t de R no se iguala con
una tupla de S, todos los datos de t desaparecen del resultado.
El outerjoin difiere del join ordinario ( o “inner” ) al adicionar al
resultado cualquier tupla de cualquier relación que no iguale
con al menos una tupla de la otra relación. Las tuplas colgantes
se rellenan con NULL en los atributos que no se igualan.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 4/34

2
Expresiones Join SQL2
Queremos obtener aquellos individuos que son estrellas pero
no ejecutivos o los ejecutivos que no son estrellas. Entonces
se debe utilizar “natural full outer join”:
EstrellasPelicula NATURAL FULL OUTER JOIN EjecutivosCine;
El resultado es una relación con seis atributos, con tres tipos
de tuplas: a) Las que representan a la vez estrellas y ejecutivos
con los 6 atributos NOT NULL; b) los individuos que son
estrellas pero no ejecutivos (los atributos de EjecutivosCine
con NULL); y c) las que representan ejecutivos pero no
estrellas (los atributos de EstrellasPelicula con NULL).

Existen muchas variaciones de la reunión externa (outerjoin)


disponibles en SQL2.

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 5/34

Expresiones Join SQL2


a) El left outerjoin, donde solo las tuplas colgadas de la relación
izquierda son rellenadas con nulos e incluidas en el resultado:
EstrellasPeliculas NATURAL LEFT OUTER JOIN
EjecutivosCine;
b) El right outerjoin, donde se rellena e incluye solo las tuplas
colgadas de la segunda relación (derecha):
EstrellasPeliculas NATURAL RIGHT OUTER JOIN
EjecutivosCine;
Otra variación en los outerjoin es cuando se especifica la condición
que las tuplas que igualen deben cumplir. En vez de la palabra
NATURAL, al join debe seguirle el ON y una condición que al
igualar las tuplas, estas deban satisfacer:
c) El FULLOUTERJOIN, donde después de igualar tuplas, se
rellenan las tuplas colgantes de cualquiera de las relaciones con
valor NULL, incluyendo en el resultado las tuplas rellenadas.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 6/34

3
Expresiones Join SQL2
Queremos unir la relaciones Película y Estrellas, usando la
condición que el titulo y el año coincidan, debemos modificar la
consulta así:
Películas FULL OUTER JOIN Estrellas ON
titulo = tituloPelicula AND año = añoPelicula;
La palabra clave FULL puede ser reemplazada por LEFT o
RIGHT en el anterior tipo de outerjoin:

d) Películas LEFT OUTER JOIN Estrellas ON


titulo = tituloPelicula AND año = añoPelicula;

e) Películas RIGHT OUTER JOIN Estrellas ON


Titulo = tituloPelicula AND Año = añoPelicula;

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 7/34

Restricciones en SQL2
La integridad de los datos en una base de datos es un
aspecto muy importante a tener en cuenta en la
implementación de un diseño. Existen al menos dos formas
de mantenerla:
a. Incorporando las restricciones en los programas de aplicación
(se multiplica el código específico que implementa restricciones
en las aplicaciones).
b. Incorporando declaraciones al SMBD, formando parte del
esquema de la base de datos.
SQL2 provee una variedad de técnicas para implementar
Restricciones de integridad como parte del esquema de la
base de datos.
Veamos los diferentes tipos de restricción previstos en SQL:
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 8/34

4
Restricciones en SQL2
Declaración de Llaves
Es el tipo de restricción más importante en una base de
datos. Se prohibe que dos tuplas de una relación
coincidan en el atributo declarado como llave.
La llave se declara dentro del comando SQL CREATE
TABLE. Hay dos formas similares de declarar una llave:
usando la cláusula PRIMARY KEY o la cláusula UNIQUE.
Hay dos formas de declarar una llave primaria:
1) Se puede declarar un atributo como llave primaria cuando
se define el esquema relacional.
CREATE TABLE Hospital (
numeroH smallint PRIMARY KEY
... );
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 9/34

Restricciones en SQL2
2) Se puede agregar al esquema ya declarado, una nueva
declaración que defina la llave de la relación:
CREATE TABLE Personal (
hospitalNro smallint, codigo smallint, nombre varchar (40), ...
PRIMARY KEY (hospitalNro, codigo)
... );
Para utilizar la cláusula UNIQUE basta con reemplazar la palabra
PRIMARY KEY por UNIQUE. Tiene la misma importancia de una
declaración de llave primaria. Sin embargo, en una tabla puede
haber varias declaraciones UNIQUE pero solo una llave primaria.
Muchas versiones SQL ofrecen la creación de índices que usan la
cláusula UNIQUE para declarar el (o los) atributos (s) que serán
llave al mismo tiempo que crea un índice sobre dicho atributo:
CREATE UNIQUE INDEX indiceAño ON Películas (año);

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 10/34

5
Restricciones en SQL2
Integridad Referencial y Llaves Foráneas
Un segundo tipo de restricción en el esquema de la base de datos
es que los valores de algunos atributos deben ser lógicos.
Estamos hablando de la “integridad referencial”, concepto que
esta estrechamente relacionado con el concepto de Llave
Foránea, que establece que el valor de un atributo puede ser nulo
o su valor exista como valor en la llave primaria de otra tabla.
La llave foráneas permite implementar relaciones uno a muchos.
CREATE TABLE Medico (
hospitalNro smallint, codigo smallint, nombre varchar (40),...
CONSTRAINT fkHosp FOREIGN KEY (hospitalNro)
REFERENCES Hospital (numeroH)
... );
donde fkHosp es el nombre de la restricción.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 11/34

Restricciones en SQL2
Declaración de restricciones de la llave foránea
En SQL podemos declarar uno o varios atributos como llave
foránea, referenciando el (los) atributo(s) de otra relacion (que
puede ser la misma relación). Esta declaración trae las
siguientes implicaciones:
1. Los atributos referenciados en la segunda relación deben ser
declarados como llave primaria de su relacion.
2. Un valor del atributo de la llave foránea en la primera tabla,
también debe aparecer en el correspondiente atributo de la
segunda relación: restricción de integridad referencial .
Hay dos formas de declarar llaves foráneas:
a. Si la llave foránea es una tributo simple, podemos usar:
REFERENCES <tabla> (<atributos>)

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 12/34

6
Restricciones en SQL2
b. Anexar a la lista de atributos (CREATE TABLE) una o más
declaraciones enunciando que un conjunto de atributos son una
llave foránea. Indicamos despues la tabla y sus atributos(que
son llave primaria). La forma es:
FOREING KEY <atributos> REFERENCES <tabla> (<atributos>)
CREATE TABLE Estudio (
nombreEst CHAR ( 30) PRIMARY KEY,
direcciónEst VARCHAR (225),
codProductor INT REFERENCES EjecutivosCine (codProductor)
);
Una forma alternativa será:
CREATE TABLE Estudio (
nombreEst CHAR (30) PRIMARY KEY, direcciónEst VARCHAR (225),
codProductor INT,
FOREIGN KEY codProductor INT
REFERENCES EjecutivosCine (codProductor) );

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 13/34

Restricciones en SQL2
Mantenimiento de la Integridad Referencial
En SQL se dispone de varias formas de implementar la
conservación de las restricciones de integridad referencial.
Rechazar las modificaciones que violan la integridad referencial
Lo cual es la política por defecto en SQL. Las siguientes acciones
serán rechazadas por el sistema (error en tiempo de ejecución):
Intento de insertar una tupla cuyo valor en la llave foránea no es
nulo o no existe como valor de la llave primaria.
Intento de actualizar una tupla cuya valor de llave foránea no
existe como valor en la llave primaria. La tupla original permanece
igual.
Intento de eliminar una tupla en la tabla de la llave primaria cuando
su componente aparece como valor en la llave foránea de la
segunda relación en una o más tuplas. Se rechaza eliminación y
se conservan las demás tuplas.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 14/34

7
Restricciones en SQL2
●Política en cascada
Cuando se borran o actualizan tuplas en la tabla que posee la
llave primaria, se borran o se actualizan las tuplas relacionadas
en la tabla que posee la llave foránea.

●Política de asignar valor nulo


En la cual ante retiros o modificaciones de tuplas en la tabla
que posee la llave primaria, se modifican los valores de la tabla
que maneja la llave foránea, cambiándolos a NULL.

zPolítica de asignar valor por defecto


En la cual ante retiros o modificaciones de tuplas en la tabla
que posee la llave primaria, se modifican los valores de la tabla
que maneja la llave foránea cambiándolos al valor DEFAULT.

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 15/34

Restricciones en SQL2
Veamos la sintaxis:
FOREIGN KEY ( a1, , ... , aj)
REFERENCES R (K1, ... , Kj)
[ON DELETE {SET DEFAULT | SET NULL | CASCADE | NO ACTION}]
[ON UPDATE {SET DEFAULT | SET NULL | CASCADE | NO ACTION}]

En el ejemplo
CREATE TABLE Estudio (
nombreEst CHAR ( 30) PRIMARY KEY,
direcciónEst VARCHAR (225),
codProductor INT REFERENCES EjecutivosCine (codProductor)
ON DELETE SET NULL
ON UPDATE CASCADE );
Las acciones alternativas son SET DEFAULT, SET NULL,
CASCADE y NO ACTION. La acción por defecto es (no hacer
nada) NO ACTION.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 16/34

8
Restricciones en SQL2
Restricciones de los Valores de Atributos
Un tercer grupo de restricciones lo constituyen las
restricciones que limitan los valores que pueden aparecer en
los componentes de algunos atributos. Se pueden expresar
como una restricción al atributo dentro de la definición del
esquema o, como una restricción de dominio del atributo en
cuestión.
Algunas de las formas de implementación de este tipo de
restricciones se pueden expresar mediante:
Restricciones NO NULAS
Se asocia a la opción NOT NULL; especifica que no se puede
ingresar un valor nulo para el atributo. Ejemplo:
codProductor INT NOT NULL,

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 17/34

Restricciones en SQL2
Restricciones CHECK Basadas en Atributos
Se pueden incorporar restricciones más complejas a la
declaración de un atributo mediante la palabra clave CHECK,
seguida de una condición entre paréntesis.
En la práctica es una limitación simple sobre valores, aunque
en teoría la condición puede ser cualquier cosa que le siga al
where en una consulta SQL.
Una restricción CHECK basada en atributo se verifica
siempre que una tupla cualquiera reciba en ella un nuevo
valor (actualización, o inserción).
La restricción CHECK basada en atributo NO se verifica
necesariamente, si una modificación de la BD no cambia el
valor del atributo al cual se asocia la restricción; esta
limitación puede hacer que se viole la restricción.

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 18/34

9
Restricciones en SQL2
Sintaxis:
CHECK (Condición de búsqueda)
Ejemplos:Suponga que se requiere que el codProductor sea de al
menos 6 dígitos en la relación Estudio:
codProductor INT REFERENCES EjecutivosCine (codProductor)
CHECK (codProductor >=100000);
Ejemplo: verificar el sexo en las relación EjecutivosCine que tenga
un carácter y que pueda tomar los siguientes valores `F´ o `M´:
sexo CHAR (1) CHECK (sexo IN ( `F´,`M´) )

CREATE TABLE Hospital (


...
camas smallint CHECK (camas < 1000),
... );

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 19/34

Restricciones en SQL2
CREATE TABLE Hospital (
...
camas smallint CHECK
(camas <= (SELECT count (*)/10 FROM Personal) )
... );
CREATE TABLE Paciente (
...
cuota decimal (8,2),
nroFarmacia smallint,
consuSinCargo smallint
...
CHECK ((cuota between 50 and 500) and
(nroFarmacia between 10 and 100) and
(consuSinCargo between 1 and 20) )
... );

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 20/34

10
Restricciones en SQL2
CREATE TABLE Medico (
...
especial char (5) CHECK (
(especial IN (‘clini’, ’pedia’, ’traum’, ’obste’, ’cardi’, ‘otras’ ) )
... );
Restricciones de Dominios
También se puede restringir los valores de un atributo al
declarar un dominio con un restricción similar y declarando que
el dominio es el tipo de dato para el atributo. En SQL2 se usa la
palabra reservada VALUE para referirse a un valor del dominio.
Ejemplo: declarar un domino, dominioSexo con los caracteres
`F´ y `M´ como unión de valores permitidos:
CREATE DOMAIN dominioSexo CHAR (1)
CHECK (VALUE IN (`F´, M´) );

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 21/34

Restricciones en SQL2
Por lo tanto, el definir el atributo sexo en la relación
EjecutivosCine puedo hacerlo así:
sexo dominioSexo,
Ejemplo: Crear un dominio para el atributo codProductor
número de al menos 6 dígitos en la relación Estudio :
CREATE DOMAIN dominioProductor INT
CHECK (VALUE >= 100000);
Y luego al reescribir la declaración de codProductor:
codProductor dominioProductor
REFERENCES EjecutivosCine (codProductor)
Obtenemos la restricción deseada. Ejemplos:
CREATE DOMAIN clave AS integer CHECK (Value > 30)
CHECK (Value is NOT NULL);
CREATE DOMAIN color AS char (10) DEFAULT ´Sin color´
CHECK (Value IN (´Sin color´, ´Azul´, Ámarillo´, ´Rojo´, ´Negro´));
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 22/34

11
Restricciones en SQL2
Restricciones Globales
Corresponden al tipo de declaración de restricciones más complejas;
se refieren a las relaciones entre varios atributos o incluso a
relaciones diversas. Son de dos tipos:
Restricciones CHECK basadas en tuplas, que limitan cualquier
aspecto de las tuplas de una sola relación.
Aserciones, son aquellas que pueden incluir relaciones enteras o
algunas variables de tuplas que abarcan la misma relación.

Restricciones CHECK Basadas en Tuplas


Para declarar una restricción sobre tuplas de una tabla, al definirla
(CREATE TABLE) podemos agregar a la lista de atributos y a las
declaraciones de llaves o llaves foráneas la palabra clave CHECK
seguida de una condición entre paréntesis.

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 23/34

Restricciones en SQL2
La restricción CHECK basada en tuplas se evalua cada vez que
se realice una inserción o una actualización sobre la tabla R. Si la
condición menciona alguna relación en una subconsulta, y si una
modificación de esta relación vuelve falsa la condición en alguna
tupla de R, la verificación no mostrará ese cambio. Ejemplo:
CREATE TABLE EstrellasPelicula (
nombre CHAR (30) UNIQUE,
dirección VARCHAR (225) ,
sexo CHAR (1),
fechaNacmto DATE,
CHECK (sexo = `F´ OR nombre NOT LIKE `Sra.%´);

Se recomienda utilizar aserciones para definir restricciones más


complejas.

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 24/34

12
Restricciones en SQL2
Aserciones
Algunas veces necesitamos restricciones que involucren una
relación como un todo, por ejemplo una restricción sobre la suma u
otra función de agregación de los valores de una columna. También
cuando una restricción involucra más de una relación.
Una aserción constituye parte del esquema. Su forma general es:
CREATE ASSERTION nombreRestricción
CHECK (condición de búsqueda);

Las verificaciones basadas en tuplas pueden referirse a los atributos


de la relación en cuya declaración aparecen. En la condición de una
aserción, cualquier atributo que se mencione debe ser incluido
en la aserción, mencionando la relación en una expresión
Seleccione-De-Donde.

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 25/34

Restricciones en SQL2
Ejemplo:
CREATE ASSERTION presidentesRicos CHECK
(NOT EXISTS
(SELECT *
FROM Estudio, EjecutivosCine
WHERE Estudio.codProductor = EjecutivosCine. codProductor
AND ingresoNeto < 10000000) );
De esta forma la restricción se cumple (es verdadera) cuando la
consulta sea vacía.
Ejemplo:
CREATE ASSERTION totalSalarios CHECK
(((SELECT sum (sueldo) FROM Personal) +
(SELECT sum (sueldo) FROM Medico)) < 100000000);

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 26/34

13
Disparadores en SQL2
Los disparadores, llamados reglas Evento-Condición-Acción (o
siglas ECA), difieren de las restricciones previamente discutidas en
tres formas:
1. Los triggers solo son probados cuando ocurren ciertos
eventos, especificado por el programador de la BD. Eventos
permitidos: son inserciones, borrados, actualizaciones y el fin de una
transacción.
2. En lugar de prevenir inmediatamente el evento que activa la
acción, un trigger prueba una condición. Si esta no se satisface,
entonces no ocurre nada en el trigger en respuesta al evento.
3. Si la condición del trigger se cumple, la acción definida con el
triggers es realizada por el DBMS. La acción puede impedir que
ocurra el evento, o podría deshacer el evento (como borrar una tupla
insertada). La acción podrá ser cualquier secuencia de operaciones
sobre la base de datos,
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 27/34

Disparadores en SQL2
Características de los Triggers
1. La acción puede ser ejecutada antes, después o durante el evento
definido en el trigger.
2. La acción puede referirse a valores viejos o nuevos que se
insertaron, borraron o actualizaron en el evento que dispara la
acción del trigger.
3. Los eventos de actualización pueden especificar un atributo
particular o un conjunto de atributos.
4. Una condición puede ser especificada con una cláusula WHEN, y la
acción solo se ejecutará si la regla es activada y se cumple la
condición cuando el evento definido en el trigger ocurre.
5. El programador tiene la opción de especificar que la acción sea
realizada:
a) Una vez en cada tupla modificada
b) Una vez en todas las tuplas que cambian en una operación de BD.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 28/34

14
Disparadores en SQL2
Para crear un trigger se usa el comando CREATE TRIGGER.
Veamos su sintaxis:
CREATE [OR REPLACE] TRIGGER <nombreTrigger>
BEFORE | AFTER --Tiempo del evento
{ {INSERT | UPDATE} [OF columna(s) ] |DELETE }
ON <nombreTabla> -- Eventos disparadores
FOR EACH ROW --Tipo de Trigger
[WHEN (<condición>) ] -- Restricción al Trigger
(solo para triggers
FOR EACH ROW !)
<Bloque PL/SQL> --Cuerpo del trigger
END; -- Fin del disparador

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 29/34

Disparadores en SQL2
Vamos a aplicar un disparador a la relación
EjecutivosCine (nombre, dirección, codProductor, ingresoNeto)
para que para que opere sobre actualizaciones al atributo
ingresoNeto. El efecto de esta regla es restaurar al valor inicial por
cualquier intento de reducir el ingreso neto de un ejecutivo:
1) CREATE OR REPLACE TRIGGER ingresoNetoTrigger
2) AFTER UPDATE OF ingresoNeto on EjecutivosCine
3) REFERENCING
4) OLD AS oldTuple
5) NEW AS newTuple
6) WHEN (oldTuple.ingresoNeto > newTuple.ingresoNeto)
7) UPDATE EjecutivosCine
8) SET ingresoNeto = Oldtuple.ingresoNeto
9) WHERE codProductor = Newtuple.codProductor
10)FOR EACH ROW;

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 30/34

15
Disparadores en SQL2
A continuación mostraremos otras alternativas:
●A la cláusula AFTER: { BEFORE | INSTEAD OF }

●En reemplazo del UPDATE: { INSERT | DELETE }.


●La acción puede ser cualquier número de intrucciones separadas

por punto y coma.


●Cuando el evento del trigger es una actualización, entonces

habrá una tupla vieja y otra nueva, los cuales son las tuplas antes
y después de la actualización: OLD AS y NEW AS.
●Si se omite (FOR EACH ROW) entonces el trigger a nivel de

tupla se convierte en un trigger a nivel de instrucción, el cual se


ejecuta una vez por cada instrucción que genere uno o más
eventos definidos para el trigger. En un trigger a nivel de
instrucción nos tendremos que referir al conjunto de tuplas viejas
y nuevas, (declaraciones tales como OLD _TABLE AS
ViejosValores y NEW_TABLE AS NuevosValores.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 31/34

Disparadores en SQL2
Ejemplo. Se desea prevenir que el promedio del ingresoNeto de los
ejecutivos del cine caiga por debajo de los $5.000.000. Esta restricción
podrá ser violada por una inserción, retiro o actualización del atributo
ingresoNeto en la relación EjecutivosCine. Se necesita un trigger para
cada uno de estos eventos. En el ejemplo siguiente se muestra el trigger
para el evento de una actualización:
1) CREATE OR REPLACE TRIGGER promedioIngresoNetoTrigger
2) AFTER UPDATE OF ingresoNeto on EjecutivosCine
3) REFERENCING
4) OLD TABLE AS viejosDa
5) NEW TABLE AS nuevosDa
6) WHEN (5 000 000 <=
7) (SELECT AVG (ingresoNeto)
8) FROM ((EjecutivosCine EXCEPT viejosDa) UNION nuevosDa)))
9) DELETE FROM EjecutivosCine WHERE
(nombre, dirección, codProductor, ingresoNeto) IN viejosDa;
10) INSERT INTO EjecutivosCine (SELECT * FROM nuevosDa);
11) FOR EACH ROW;
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 32/34

16
Disparadores en SQL2
En el ejemplo siguiente se muestra el trigger para el evento
de un borrado:
1) CREATE OR REPLACE TRIGGER TriggerPromIngreNetoRet
2) AFTER UPDATE OF ingresoNeto on EjecutivosCine
3) REFERENCING
4) OLD TABLE AS viejosDa
5) WHEN (5 000 000 <=
7) (SELECT AVG (ingresoNeto)
8) FROM ((EjecutivosCine EXCEPT viejosDa) ))
9) DELETE FROM EjecutivosCine WHERE
10) (nombre, dirección, codProductor, ingresoNeto) IN viejosDa;
11) INSERT INTO EjecutivosCine
12) (SELECT * FROM viejosDa
13) WHERE codProductor=viejosDa.codProductor);
14) FOR EACH ROW;

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 33/34

Disparadores en SQL2
Se recomienda seguir las siguientes reglas para la definición de
triggers de mantenimiento de integridad:
Identifique operaciones y tablas críticas para la restricción de integridad
Por cada una de tales tablas verifique
Si la restricción puede ser verificada a nivel de fila entonces
Si la fila verificada es modificada en el trigger entonces
Use un trigger de fila con before
De lo Contrario Use un trigger de fila con After
De lo Contrario Use un trigger de instrucción con After

Los triggers no son exclusivamente utilizados para mantener la


integridad. También se puede usar para:
– Propósitos de monitoreo de acceso de usuarios y modificaciones
a ciertas tablas
– Acciones de seguridad sobre tablas

10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 34/34

17

Potrebbero piacerti anche