Está en la página 1de 13

Comparativa de Rendimiento de los Disparadores (Triggers)

entre Oracle y SQL server


Aruquipa Ch. Marcelo, Chavez D. Marcelo, Cruz U. J. Pablo,
Hurtado M. Reynaldo, Márquez Granado Edwin P.
(marcelo.aruquipa@yahoo.es, m.chavezduran@gmail.com,
jcruz@ruat.gov.bo, reyhur@hotmail.com, emarquez@ruat.gov.bo)
Universidad Mayor de San Andrés
Facultad de Ciencias Puras y Naturales
Postgrado en Informática

Resumen

En este documento se pretende realizar una comparativa del funcionamiento de los


disparadores en ORACLE y SQL Server, inicialmente se describirán las características
de ambas bases de datos con respecto a los disparado res, luego se define el juego de
datos común a utilizar en ambos motores, se procederá a definir los disparadores en
ambos motores, finalmente se realiza la ejecución de los disparadores y se realiza
respectiva comparativa de acuerdo a los tiempos de ejecu ción. Para las pruebas se
tomaran en cuenta las operaciones de inserción, actualización y borrado de registros.

Palabras clave.- Sistema Gestor de Base de Datos, Disparadores, acciones,


restrticciones, sentencias SQL.

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.

Características de los disparadores en Los triggers se disparan con los


ORACLE. privilegios del dueño y no así con los
del usuario.
Los disparadores (triggers) son
programas PL/SQL almacenados que se Entre los tipos de triggers se tienen los
asocian con una tabla o vista específicas Row Trigger que se disparan una vez
de la base de datos. El código contenido por cada fila afectada. Se utiliza la
en el trigger define la acción que la base cláusula FOR EACH ROW para
de datos necesita para realizar especificarlos. Son útiles si la acción del
manipulaciones de en la base de datos trigger depende del número de filas
cuando se da un INSERT, UPDATE o afectadas.
DELETE.
Los Statement Trigger se disparan solo
A diferencia de los procedimientos y una vez sin tomar en cuenta las filas
funciones almacenados, los cuales afectadas en la tabla. Estos triggers son

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:

La opción REFERENCING es usada CREATE TRIGGER [ owner.] nombre_trigger


para evitar conflictos con nombres entre O N [ owner.] nombre_tabla
for {insert, update, delete}}
los nombres correlac ionados y nombres AS
de tablas. Por ejemplo si se están instrucciones_SQL
usando una tabla con nombre new u old
con nombres de campos SN, NAME, o bien utilizando la clausula if update
entonces la ambigüedad aparece y para
evitarla se utiliza la opción CREATE TRIGGER [ owner.] nombre_trigger
REFERENCING. O N [ owner.] nombre_tabla
for {insert, update}}
Ejemplo AS
[if update ( nombre_columna )
CREATE OR REPLACE TRIGGER [{and | or } update ( nombre_columna )]…
MYTRIG ]
BEFORE UPDATE ON new instrucciones_SQL

REFERENCING new AS newval [if update ( nombre_columna )


[{and | or } update (nombre_columna)]…
FOR EACH ROW ]
instrucciones_SQL
BEGIN
DBMS_OUTPUT_LINE(:newval.SNO);
END; la clausula create crea el disparador y le
asigna un nombre, la clausula on indica
el nombre de la tabla que activa el
Características de los disparadores en disparador (que en ocaciones se
SQL Server denomina tabla de disparadores), la
clausula for especifica los comandos de
Para SQL Server un disparador es un modificación de datos de la tabla de
tipo especial de procedimiento disparadores que activan el disparador.
almacenado que se ejecuta cuando se Las instrucciones SQL indican las
insertan, eliminan o actualizan datos de condiciones y acciones del disparador,
una tabla especificada. Los disparadores las condiciones de un disparador
pueden ayudar a mantener la integridad especifican criterios adicionales que
de referencia de los datos conservando determinan si el comando insert, delete
la consistencia entre los datos o update hará que se lleven a cabo las
relacionados lógicamente de distintas acciones del disparador. Las acciones de
tablas. Integridad de referencia significa disparador múltiples de una clausula if
que los valores correspondientes de las deben agruparse con begin y end .
claves externas deben coincidir de
forma exacta. Para SQL Server un Una clausula if update verifica si existe
disparador es un objeto de base de datos una inserción o actualización para una
que cuando se crea se especifica la tabla columna en particular, esta clausula da
y los comandos de modificación de resultado verdadero en el caso en el que
datos que deben disparar o activar, el nombre de la columna se incluye en

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:

• Todos lo s comandos create Tabla libros


(create database, create table, código Numérico
create index, create procedure, titulo Texto
create default, create rule, cretae autor Texto
trigger, create view). precio Numérico
• Todos los commandos drop stock Numérico

• Alter table y alter database


Tabla ventas
• Truncate table
cod_ven Numérico
• Grant y revoke
fecha Fecha
• Update statistics
codigolibro Numérico
• Reconfigure
precio Numérico
• Load Database y load
cantidad Numérico
transaction
• Disk init, disk mirror, disk refit,
disk reinit, disk remirror, disk Tabla tiempo_comparacion
unmirror. codigo Numérico
• Select into descripcion Texto
tiempo Fecha
El funcionamiento de los disparadores tiempo_mili Numérico
en SQL Server empiezan cuando una
modificación de datos afecta a una El script correspondiente para la
columna clave, los disparadores creación de las tablas y el
comparan los nuevos valores de correspondiente llenado aleatorio para
columna con las claves relacionadas ambos gestores es el siguiente:
usando tablas de trabajo temporales
llamadas tablas de verificación de En SQL Server:
disparadores. Cuando se escriben los
disparadores, las comparaciones se create table libros(
basan en los datos almacenados codigo int identity,
titulo varchar(80),
temporalmente en las tablas de autor varchar(50),
verificación de los disparadores. precio decimal(6,2),
stock int,
En las instrucciones de los diaparadores constraint PK_libros primary
existen dos tablas especiales: key(codigo)
);
I. La tabla deleted (eliminada)
II. La tabla inserted (insertada) create table ventas(
cod_ven int identity,
Son dos tablas temporales usadas en la fecha datetime,
codigolibro int not null,
verificación de los disparadores, se

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;

BEGIN Para la tabla libros se hizo el llenado de


1000 registros y para la tabla ventas se
id := 11;
cade1 := id; generaron 10000 registros.
LOOP
IV. Definición del grado de
SELECT complejidad de los
ABS(dbms_random.normal) into
aleat FROM dual;
disparadores

DBMS_OUTPUT.PUT_LINE(aleat Para realizar la comparación se crearon


); tres disparadores (triggers), de
precio := MOD(aleat,10)
+ 100;
inserción, eliminación y actualización.
stock := MOD(aleat,10) + La definición de las funciones que
1; realizan los disparadores es la siguiente:
cade1 := id;
insert into libros
values(id,CONCAT('Libro '
DIS_libros_actualizar: disparador de
,cade1),CONCAT('Autor actualización creado para evitar que se
',cade1),precio,stock); modifiquen los datos de la tabla
id := id + 1; "libros".
EXIT WHEN id > 1000; --
para mil libros
END LOOP; DIS_libros_actualizar_precio:
END; disparador que evita que se actualice el
campo "precio" de la tabla "libros".
/* Genera datos para la tabla
ventas*/ DIS_ventas_borrar: disparador creado
DECLARE
precio number(6,2); para la tabla "ventas", para que cada vez
id_libro number(6,3); que se elimine un registro de la tabla
id number(5); "ventas", se actualice el campo "stock"
cant number; de la tabla "libros" (por ejemplo, si el
cade1 varchar(5);
aleat NUMBER(6,2);
comprador devuelve los libros
comprados):
BEGIN
El script para la creación de los
id := 1; disparadores es como sigue:
cade1 := id;
LOOP
En SQL Server:
SELECT
ABS(dbms_random.normal) create trigger –- Disparador 1
into aleat FROM dual; DIS_libros_actualizar
precio := MOD(aleat,10) on libros
+ 10; for update
id_libro := MOD(aleat,10) as
+ 144; declare @tiempo_inicial
cant :=MOD(aleat,10) + datetime;
10; declare @tiempo_final
cade1 := id; datetime;
insert into ventas declare @tdiferencia
values(id,'11/07/2007',id_libro, datetime;
precio,cant);

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

set @tiempo_inicial = INSERT INTO


GETDATE(); tiempo_Comparacion
update libros set stock= (codigo,descripcion, tiempo,
libros.stock+deleted.cantidad tiempomili)
from libros VALUES (codseq,'TABLA LIBROS
join deleted NO MODIFICABLE', sysdate,
on TO_NUMBER(vTFinal -
deleted.codigolibro=libros.codig vTInicial,'999.999'));
o;
set @tiempo_final = END IF;
GETDATE();
set @tdiferencia = END;
@tiempo_final - @tiempo_inicial;
CREATE OR REPLACE TRIGGER
insert into REMARQUEZ.DIS_libros_actualizar_
tiempo_comparacion values precio /* DISPARADOR 2*/
('Eliminacion en AFTER UPDATE ON libros
ventas',@tdiferencia,CAST(@tdife REFERENCING OLD AS OLD NEW AS
rencia AS FLOAT)); NEW
En Oracle : FOR EACH ROW
DECLARE
CREATE OR REPLACE TRIGGER
REMARQUEZ.DIS_libros_actualizar codseq
/* DISPARADOR 1*/ tiempo_Comparacion.codigo%TYPE;
AFTER UPDATE ON libros vTInicial CHAR(40);
REFERENCING OLD AS OLD NEW AS vTFinal CHAR(40);
NEW vDif number(10,2);
FOR EACH ROW BEGIN

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);

codseq := codseq + 1; vDif := vTFinal - vTInicial;

SELECT TO_CHAR(systimestamp, INSERT INTO tiempo_Comparacion


'SS.FF3') (codigo,descripcion, tiempo,
INTO vTFinal tiempomili)
FROM dual; VALUES (codseq,'Comparacion1',
vTFinal := sysdate, vDif);
TO_NUMBER(vTInicial);
END;
vDif := vTFinal - vTInicial;
DROP TRIGGER DIS_ventas_borrar
INSERT INTO tiempo_Comparacion COMMIT;
(codigo,descripcion, tiempo,
tiempomili)
VALUES (codseq,'Comparacion1', V. Análisis de los mismos
sysdate, vDif);
disparadores para las mismas
END; cantidades de filas y por la
función que realizan
CREATE OR REPLACE TRIGGER
REMARQUEZ.DIS_ventas_borrar /*
DISPARADOR 3*/ Para el análisis de los disparadores se
AFTER DELETE ON ventas obtuvo los siguientes datos:
REFERENCING OLD AS OLD NEW AS
NEW
FOR EACH ROW SQL SERVER
DECLARE Disparador: DIS_Libros_actualizar
Nro. Tiempo Script
codseq Registros
tiempo_Comparacion.codigo%TYPE; update libros SET autor = 'Juancito Pinto'
10000 0,36
vStock number(5) := 0; where codigo >90000;
vTInicial CHAR(40); 50000 2,47 update libros SET autor = 'Juancito Pinto'
where codigo >50000;
vTFinal CHAR(40); update libros SET autor = 'Juancito Pinto'
vDif number(10,2); 90000 4,017
where codigo >10000;
BEGIN update libros SET autor = 'Juancito Pinto'
SELECT TO_CHAR(systimestamp, 99000 4,533 where codigo >100;
'SS.FF3')
INTO vTInicial ORACLE
FROM dual; Disparador: DIS_Libros_actualizar
vTInicial := Nro. Tiempo Script
TO_NUMBER(vTInicial); Registros
update libros SET autor = 'Juancito Pinto'
10000 0,893
where codigo >90000;
50000 2,085 update libros SET autor = 'Juancito Pinto'

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;

La grafica correspondiente para este


disparador es la siguiente:

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;

ORACLE La grafica correspondiente para este


Disparador: DIS_libros_actualizar_precio disparador es la siguiente:
Nro.
Registro
s Tiempo Script
update libros SET precio = 48.87
10000 0,843 where codigo >90000;
update libros SET precio = 48.87
50000 3,016 where codigo >50000;
update libros SET precio = 48.87
90000 4,14 where codigo >10000;
update libros SET precio = 48.87
99000 5,79 where codigo >100;

La grafica correspondiente para este


disparador es la siguiente:

VI. Conclusiones

De acuerdo a los experimentos


realizados, se concluye que para ambos
gestores los disparadores de
actualización tienen mínima variación

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

Para manipular los nuevos y viejos


registros en Oracle se usan los
identificadores :new y :old, mientras Características Oracle SQL
que en SQL Server se utilizan las Fundamentales Server
instrucciones inserted y deleted. ACID Si Si
Integridad Si No
Referencial
Oracle es mucho mas avanzada y segura Transacciones Si No
que SQL Server, y en tanto a uso, en Unicode
oracle existen los Esquemas, que son
usuarios avanzados que pueden tener a
su disposicion espacios de la base de
datos, y en SQL Server, en vez de Tablas y Vistas Oracle SQL
esquemas están las bases. entonces en Server
Oracle se tiene n esquemas y en SQL Tabla temporal Si Si
Server bases. Vista Si No
Materializada

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.

Particionamiento Oracle SQL [10] Patagalla Nagavalli Nathan,


Server Oracle9i: Develop PL/SQL Program
Rango Si Si
Units. Volume I, II and III. Oracle
Hash Si No
Compuesto Si No Corporation.
Lista Si No
Sitios en Internet:

[11] oracle DBMS_random,


VII. Bibliografia http://www.psoug.org/reference/dbms_r
andom.html
Libros:
[12] Oracle Table Triggers
[1] Scoot Urman , “Oracle9i http://www.psoug.org/reference/table_tr
Programacion PL/SQL”, McGraw-Hill. igger.html
España.
[13] Trigger (base de datos)
[2] Alarcon H. E, Crovetto C., “Bases http://es.wikipedia.org/wiki/Trigger_(ba
de Datos en SQL Server 2005 ”, Grupo se_de_datos)
Editorial MegaByte, Lima Perú.
[14] This page contains materials that
[3] Oracle® Database Application were copied from Oracle's on-line
Developer's Guide – Fundamentals, 10g documents
Release 2 (10.2), Part Number B14251- http://courses.csusm.edu/cs643yo/slides
01. /triggers.htm

[4] Kevin Loney, “Oracle Database


10g: The Complete Reference”, Mc [15] Manual de Oracle
Graw-Hill/Osborne. Emerville, http://www.programatium.net/cursos/
California, U.S.A. oracle/11.htm

[5] Oracle® Database Quick [16] Create Trigger en Oracle


Installation Guide, Release 2 (10.2), http://www.adp-
Part Number B14251-01. gmbh.ch/ora/sql/create_trigger.html
[17] Oracle/PLSQL Topics: Creating
[6] Coronel Gustavo, Oracle9i “SQL & Triggers
PL/SQL” , CEPS’uni, Centro de http://www.techonthenet.com/oracle/tri
Extension y Proyeccion Social. ggers/

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

[20] Triggers en Transact SQL


http://www.devjoker.com/contenidos/T
utorial-de-Transact-SQL/278/Triggers-
en-Transact-SQL.aspx

[21] Uso de T riggers en SQL Server


http://alexjimenez.wordpress.com/2007/
08/13/uso-de-triggers-en-sql-server/

[22] Comparación de sistemas


administradores de bases de datos
relacionales
http://es.wikipedia.org/wiki/Anexo:Com
paraci%C3%B3n_de_sistemas_administ
radores_de_bases_de_datos_relacionale
s

13