Академический Документы
Профессиональный Документы
Культура Документы
Resumen
I. Introducción
Se utilizó Oracle 10g Express Edition y
Un disparador o un Trigger en una base la versión SQL Server 2000. El equipo
de datos es un evento que se ejecuta para realizar las pruebas tiene las
cuando se cumple una condición siguientes características:
establecida al realizar una operación de
inserción (insert), actualización (update) • Sistema Operativo: Microsoft
o borrado (delete). Se usan para mejorar Windows XP Professional.
la administración de una base de datos • Version: 5.1.2600 Service Pack
sin necesidad de contar con el usuario 2 Compilación 2600.
que ejecute la instrucción SQL. Además • Modelo del Sistema: HV84510A
pueden generar valores de columnas, • Tipo de Sistema : Equipo basado
prevención de errores, sincronización de en X86.
tablas, modificación de valores de una • Procesador : x86 Family 15
vista, Permite implementar programas Model 1 Stepping 2
basados en paradigma lógico (sistemas GenuineIntel ~1694 MHz.
expertos, deducción). • Memoria física total: 384,00
MB.
II. Descripción del Problema. • Memoria física disponible: 41,35
MB
En el presente documento realizamos • Memoria virtual total: 2,00 GB
una comparativa del rendimiento de los • Memoria virtual disponible: 1,96
disparadores (triggers) entre los GB.
Gestores de Bases de Datos SQL Server
y Oracle.
1
Estructura Básica de un Trigguer. tienen que ser invocados expícitamente,
los trigges son disparados (ejecutados)
La estructura básica de un Trigguer es: implícitamente cuando la tabla es
1. Llamada de activación, es la afectada por cualquiera de las
sentencia que permite disparar el operaciones DML mencionadas.
código a ejecutar.
2. Restricción, es la condición Los triggers están compuesto por tres
necesaria para realizar el código. partes
3. Acción a ejecutar, es la
secuencia de instrucciones a • Un evento disparador
ejec utar una vez que se han • Una restricción (Opcional)
cumplido las condiciones • Una acción
iniciales.
El evento disparador puede ser una
Tipos de Trigguers declaración insert, update o delete, así
como también una instancia shutdown o
Según la cantidad de ejecuciones a startup, etc. Los triggers se disparan
realizar los trigguers se clasifican en: automáticamente cuando uno de esos
eventos ocurren.
1. Row Trigguers (Trigguers de
Fila) Las restricciones especifican una
2. Statement Trigguers (Trigguers expresión Booleana que debe ser
de Secuencia) verdadera para que el trigger sea
disparado. Esta condición es
Los Row Trigguers son aquellos que se especificada usando la cláusula WHEN.
ejecutaran n-veces sise llaman n-veces
desde la tabla a la que esta asociada el Las acciones son procedimientos que
Trigguer. Los Statement Trigguers son contienen el código que va a ser
aquellos que sin importer la cantidad de ejecutado cuando el trigger se dispare.
veces que se cumpla con la condición,
su ejecución es única. Ambos tipos de Hasta la versión 7.0 de Oracle solo 12
Trigguers pueden ser de sesión o triggers podían asociarse con una tabla,
pueden estar almacenados. mientras que para las versiones
superiores esa limitación ya no existe.
2
útiles cuando la acción del trigger no • BEFORE CREATE OR AFTER
depende del número de filas afectadas. CREATE es disparado cuando
un objeto es creado
Se puede especificar también si la • BEFORE OR AFTER ALTER
acción del trigger será ejecutada antes o es disparado cuando un objeto es
después de la declaración de disparo. alterado
Los triggers BEFORE y AFTER que • BEFORE OR AFTER DROP es
son disparados por declaraciones DML disparado cuando un objeto es
pueden ser definidos solamente para eliminado
tablas.
Los triggers pueden ser habilitados o
En los triggers BEFORE la acción se deshabilitados. Los triggers son
ejecuta antes de la declaración de automáticamente habilitados cuando
disparo. Más al contrario en los triggers son creados. Se necesita rehabilitar un
AFTER la acción es ejecutada después trigger para utilizarlo si es que fue
de la declaración de disparo. deshabilitado. Para habilitar o
deshabilitar un trigger utilizando el
Los triggers INSTEAD OF proveen una comando ALTER TRIGGER se
manera de modificar vistas que no necesita ser dueño del trigger o tener
pueden ser modificadas directamente privilegios de ALTER ANY TRIGGER.
usando declaraciones DML. De la misma manera, para crear un
trigger se necesita tener privilegios de
Los triggers LOGON se disparan CREATE TRIGGER los cuales son
después de que el usuario se ha proporcionados como parte de los
autentificado con éxito, y los triggers privilegios de RESOURCE al momento
LOGOFF se disparan al inicio del de crear al usuario.
abandono de la sesión por parte del
usuario. La sintaxis general de los triggers es la
siguiente:
Es importante tomar en cuenta lo
siguiente: CREATE [OR REPLACE] TRIGGER
<trigger-name>
• Un trigger no puede incluir BEFORE | AFTER
COMMIT, SAVEPOINT y DELETE | [OR] INSERT | [OR] UPDATE
ROLLBACK [OF <column> [, <column>...]]
• Se puede usar solo un trigger de ON <table-name>
un tipo particular
[REFERENCING [OLD [AS] <old> [NEW
• Una tabla puede tener cualquier [AS] <new>]]
número de triggers
• Se utilizan nombres [FOR EACH ROW [WHEN <condition>]]
correlacionados con :new y :old
para referirse a datos en la línea BEGIN
PL/SQL block
de comandos y datos en una END;
tabla respectivamente.
Cuando se utilizan los row triggers, la
Los triggers DDL pueden ser de los acción puede acceder a valores de las
siguientes tipos columnas de la fila que está siendo
procesada. Esto es hecho utilizando
nombres correlacionados, existiendo
dos nombres correlacionados para cada
3
columna en la tabla, uno para el luego se indica la acción o las acciones
antiguos valor de la columna y el otro es que debe llevar a cabo un disparador.
para el nuevo valor de la columna,
donde se usa el calificador :new para el La sintaxis completa para la creación de
nuevos valor y :old para el valor un Trigger en SQL Server es la
antiguo. siguiente:
4
la clausula set de una instrucción utilizan estos datos para comprobar los
update aunque la actualización no efectos de algunas modificaciones de
cambie el valor de la columna, esta datos y definir las condiciones de
clausaula no se utiliza con delete . No se acciones del disparador.
debe utilizar el nombre de la tabla
delante del nombre de la columna con if III. Definición de Juego de Datos
update.
Para la comparación de rendimiento se
Existen instrucciones que no se crearon las siguientes tablas:
permiten en un disparador:
5
precio decimal (6,2), Set @cade1 = @id;
cantidad int, While (@id <= 100000 )
constraint PK_ventas primary Begin
key(numero), Set @precio =
constraint ABS(CAST(NEWID() as binary(6)) %
FK_ventas_codigolibro 100) + 2;
foreign key (codigolibro) Set @id_libro =
references libros(codigo) ABS(CAST(NEWID() as binary(6)) %
); 100) + 1;
Set @cant =
create table tiempo_comparacion( ABS(CAST(NEWID() as binary(6)) %
codigo int identity, 10) + 1;
descripcion varchar(50), Set @cade1 = @id;
tiempo datetime, insert into
tiempomili float, ventas
constraint values(@fecha_venta,@id_libro,@p
PK_tiempo_comparacion primary recio,@cant);
key(codigo) Set @id = @id + 1;
); End
GO
/* Genera datos para libros*/
CREATE PROCEDURE En Oracle :
genera_datos_libros AS
create table libros(
Declare @precio integer;
codigo number(5),
Declare @stock integer;
titulo varchar(80),
Declare @id integer;
autor varchar(50),
Declare @cade1 Varchar(5);
precio number(6,2),
stock number(5),
Set @id = 5; constraint PK_libros primary
Set @cade1 = @id; key(codigo)
While (@id < 1001 ) );
Begin
Set @precio = create table ventas(
ABS(CAST(NEWID() as binary(6)) % cod_ven number(10),
100) + 1; fecha date,
Set @stock = codigolibro number(5) not
ABS(CAST(NEWID() as binary(6)) %
null,
1000) + 1; precio number(6,2),
Set @cade1 = cantidad number(5),
@id; constraint PK_ventas primary
insert into libros key(cod_ven),
values('Libro ' + @cade1,'Autor constraint
' + @cade1,@precio,@stock);
Set @id = @id + 1; FK_ventas_codigolibro
foreign key (codigolibro)
End
references libros(codigo)
GO
);
/* Genera datos para ventas*/ create table tiempo_comparacion(
CREATE PROCEDURE codigo number(5),
genera_datos_ventas @fecha_venta descripcion varchar(50),
datetime -- = '2007/04/01' tiempo date,
AS tiempomili number(10,2),
constraint
Declare @precio integer; PK_tiempo_comparacion primary
Declare @id_libro integer;
key(codigo)
Declare @id integer;
Declare @cant integer; );
Declare @cade1 Varchar(5); /* Genera datos para libros*/
DECLARE
Set @id = 1; precio number(6,3);
6
stock number; id := id + 1;
id number(5); EXIT WHEN id > 99999;
cade1 varchar(5); END LOOP;
aleat NUMBER(6,2); END;
7
set @tiempo_inicial = codseq
GETDATE(); tiempo_Comparacion.codigo%TYPE;
vTInicial CHAR(40);
raiserror('Los datos de la vTFinal CHAR(40);
tabla "libros" no pueden vDif number(10,2);
modificarse', 10, 1) BEGIN
rollback transaction
set @tiempo_final = SELECT TO_CHAR(systimestamp,
GETDATE(); 'SS.FF3')
set @tdiferencia = INTO vTInicial
@tiempo_final - @tiempo_inicial; FROM dual;
vTInicial :=
insert into TO_NUMBER(vTInicial);
tiempo_comparacion values
('Actualizacion en la tabla SELECT MAX(tco.codigo)
libros',@tdiferencia,CAST(@tdife INTO codseq
rencia AS FLOAT)); FROM tiempo_Comparacion tco;
codseq := codseq + 1;
create trigger DIS_ventas_borrar
--DISPARADOR 3 SELECT TO_CHAR(systimestamp,
on ventas 'SS.FF3')
for delete INTO vTFinal
as FROM dual;
declare @tiempo_inicial vTFinal :=
datetime; TO_NUMBER(vTInicial);
declare @tiempo_final
datetime; vDif := vTFinal - vTInicial;
declare @tdiferencia
datetime; IF UPDATING THEN
DECLARE
8
SELECT TO_CHAR(systimestamp, UPDATE libros SET stock =
'SS.FF3') stock + :old.cantidad --FROM
INTO vTInicial libros
FROM dual; WHERE :old.codigolibro =
vTInicial := libros.codigo;
TO_NUMBER(vTInicial);
SELECT MAX(tco.codigo)
IF UPDATING THEN INTO codseq
FROM tiempo_Comparacion tco;
DBMS_OUTPUT.PUT_LINE('EL
PRECIO DEL LIBRO NO PUEDE codseq := codseq + 1;
MODIFICARSE');
SELECT TO_CHAR(systimestamp,
END IF; 'SS.FF3')
INTO vTFinal
SELECT MAX(tco.codigo) FROM dual;
INTO codseq vTFinal :=
FROM tiempo_Comparacion tco; TO_NUMBER(vTInicial);
9
where codigo >50000;
update libros SET autor = 'Juancito Pinto'
90000 3,925 where codigo >10000;
update libros SET autor = 'Juancito Pinto'
99000 4,473
where codigo >100;
SQL SERVER
Disparador: DIS_ventas_borrar
Nro.
Registros Tiempo Script
delete ventas
10000 0,47 where codigolibro >90000;
delete ventas
50000 3,453 where codigolibro >50000;
delete ventas
90000 4,013 where codigolibro >10000;
delete ventas
99000 5,013 where codigolibro >100;
SQL SERVER
ORACLE
Disparador: DIS_libros_actualizar_precio
Nro. Disparador: DIS_ventas_borrar
Registros Tiempo Script Nro.
update libros SET precio = 48.87 Registros Tiempo Script
10000 0,343 where codigo >90000; delete ventas
update libros SET precio = 48.87 10000 0,61 where codigolibro >90000;
50000 2,357 where codigo >50000; delete ventas
update libros SET precio = 48.87 50000 3,653 where codigolibro >50000;
90000 3,72 where codigo >10000; delete ventas
update libros SET precio = 48.87 90000 5,002 where codigolibro >10000;
99000 5,08 where codigo >100; delete ventas
99000 5,798 where codigolibro >100;
VI. Conclusiones
10
de tiemp o en su ejecución. En cambio Oracle , es una de las mas grandes y
los disparadores de eliminación de SQL poderosas , esta orientada a compañias
Server son más rápidos que los grandes con volumenes de informacion
disparadores de eliminación de Oracle. altos, ademas de tener sus propias
herramientas para diseño y desarrollo.
Los triggers en oracle Y SQL Server se Por lo que de SQL Server , es que es
pueden definir para cualquier evento, es una Base de Datos que tiene como
decir, se puede definir que el trigger sea mayor ventaja su completa
antes o despues de cualquier operacion compatibilidad con los productos
de DML que se realice sobre una tabla, MicroSoft , ademas de ser rápida.
adicionalmente en Oracle se puede
definir que el siparo se realice antes o Finalmente mostramos una tabla
después de la ejecución de la comparativa entre SQL Server y Oracle.
instrucción.
Información Oracle SQL
A diferencia de Oracle en SQL Server Gene ral Server
es posible confirmar o deshacer una Creador Oracle Microsoft
Corporation
transacción, es decir que en un trigger Fecha 1977 1989
de SQL Server es posible incluir Primera
instrucciones COMMIT y Version
ROLLBACK. Publica
Ultima 11g Release 9.00.2047
versión 1 (2005
En SQL Sever las acciones de
estable SP1)
disparador múltiples de una clausula if Licencia Propietario Propietario
deben agruparse con begin y end.
Mientras que en Oracle la definición de
un trigger se realiza el un bloque de
código PL/SQL. Sistema Oracle SQL
Operativo Server
Windowa Si Si
El uso de OR REPLACE permite Mac OS X Si No
Linux Si No
sobreescribir un trigger existente. Si se
BSD No No
omite, y el trigger existe, se producirá, Unix Si No
un error. z/OS Si No
11
[7] Michael Gertz , Oracle / SQL
Tutorial , Department of Computer
Objetos Oracle SQL Science University of California
Server
Dominio Si No [8] Priya Nathan, Oracle9i: Advanced
Cursor Si Si
Trigger Si Si SQL, Student Guide-Volume I. Oracle
Función Si Si Corporation.
Procedimiento Si Si
Rutina Externa Si Si [9] Priya Nathan, Oracle9i: Advanced
SQL, Student Guide-Volume II. Oracle
Corporation.
12
[18] CREATE TRIGGER
http://cs.ifmo.ru/~ad/Documentation/ora
cle-10g- lib-
doc/server.101/b10759/statements_7004
.htm
[19] Triggers en Oracle 8i
http://www.orape.net/article15.html
13