Вы находитесь на странице: 1из 8

Ingresamos algunos registros:

insert into empleados values('22222222','Ana Acosta','Bulnes


56','Secretaria');
insert into empleados values('23333333','Bernardo Bustos','Bulnes
188','Contaduria');
insert into empleados values('24444444','Carlos Caseres','Caseros
364','Sistemas');
insert into empleados values('25555555','Diana Duarte','Colon
1234','Sistemas');
insert into empleados values('26666666','Diana Duarte','Colon
897','Sistemas');
insert into empleados values('27777777','Matilda Morales','Colon
542','Gerencia');

Creamos un disparador que se active cuando modificamos algún campo de


"empleados" y almacene en "controlCambios" el nombre del usuario que realiza la
actualización, la fecha, el dato que se cambia y el nuevo valor:

create or replace trigger tr_actualizar_empleados


before update
on empleados
for each row
begin
if updating('documento') then
insert into controlCambios values(user,sysdate, :old.documento,
:new.documento);
end if;
if updating('nombre') then
insert into controlCambios values(user,sysdate, :old.nombre, :new.nombre);
end if;
if updating('domicilio') then
insert into controlCambios values(user,sysdate, :old.domicilio,
:new.domicilio);
end if;
if updating('seccion') then
insert into controlCambios values(user,sysdate, :old.seccion,
:new.seccion);
end if;
end tr_actualizar_empleados;
/

Creamos otro desencadenador que se active cuando ingresamos un nuevo registro en


"empleados", debe almacenar en "controlCambios" el nombre del usuario que realiza el
ingreso, la fecha, "null" en "datoanterior" (porque se dispara con una inserción) y en
"datonuevo" el documento:

create or replace trigger tr_ingresar_empleados


before insert
on empleados
for each row
begin
insert into controlCambios values(user,sysdate, null, :new.documento);
end tr_ingresar_empleados;
/

Creamos un tercer trigger sobre "empleados" que se active cuando eliminamos un


registro en "empleados", debe almacenar en "controlCambios" el nombre del usuario
que realiza la eliminación, la fecha, el documento en "datoanterior" y "null" en
"datonuevo":

create or replace trigger tr_eliminar_empleados


before delete
on empleados
for each row
begin
insert into controlCambios values(user,sysdate, :old.documento, null);
end tr_eliminar_empleados;
/

Los tres triggers están habilitados. Consultamos el diccionario "user_triggers" para


corroborarlo:

select trigger_name, triggering_event, status


from user_triggers
where trigger_name like 'TR%EMPLEADOS';

Vamos a ingresar un empleado y comprobar que el trigger "tr_ingresar_empleados" se


dispara recuperando los registros de "controlCambios":

insert into empleados values('28888888','Pedro Perez','Peru


374','Secretaria');
select *from controlCambios;

Deshabilitamos el trigger "tr_ingresar_empleados":

alter trigger tr_ingresar_empleados disable;

Consultamos el diccionario "user_triggers" para corroborarlo:

select trigger_name, status


from user_triggers
where trigger_name like 'TR%EMPLEADOS';

El trigger "tr_ingresar_empleados" está deshabilitado, "tr_actualizar_empleados" y


"tr_elimnar_empleados" están habilitados.

Vamos a ingresar un empleado y comprobar que el trigger de inserción no se dispara


recuperando los registros de "controlCambios":

insert into empleados values('29999999','Rosa Rodriguez','Rivadavia


627','Secretaria');
select *from controlCambios;
Vamos a actualizar el domicilio de un empleado y comprobar que el trigger de
actualización se dispara recuperando los registros de "controlCambios":

update empleados set domicilio='Bulnes 567' where documento='22222222';


select *from controlCambios;

Deshabilitamos el trigger "tr_actualizar_empleados":

alter trigger tr_actualizar_empleados disable;

Consultamos el diccionario "user_triggers" para corroborarlo:

select trigger_name, status


from user_triggers
where trigger_name like 'TR%EMPLEADOS';

Los triggers "tr_ingresar_empleados" y "tr_actualizar_empleados" están deshabilitados,


"tr_eliminar_empleados" está habilitado.

Vamos a borrar un empleado de "empleados" y comprobar que el trigger de borrado se


disparó recuperando los registros de "controlCambios":

delete from empleados where documento= '29999999';


select *from controlCambios;

Deshabilitamos el trigger "tr_eliminar_empleados":

alter trigger tr_eliminar_empleados disable;

Consultamos el diccionario "user_triggers" para comprobarlo:

select trigger_name, status


from user_triggers
where table_name = 'EMPLEADOS';

Los tres trigger establecidos sobre "empleados" están deshabilitados.

Eliminamos un empleado de "empleados" y comprobamos que el trigger de borrado no


se dispara recuperando los registros de "controlCambios":

delete from empleados where documento= '28888888';


select *from controlCambios;

Habilitamos el trigger "tr_actualizar_empleados":

alter trigger tr_actualizar_empleados enable;

Actualizamos la sección de un empleado y comprobamos que el trigger de


actualización se dispara recuperando los registros de "controlCambios":
update empleados set seccion='Sistemas' where documento='23333333';
select *from controlCambios;

Habilitamos todos los triggers establecidos sobre "empleados":

alter table empleados enable all triggers;

Consultamos el diccionario "user_triggers" para comprobar que el estado (status) de


todos los triggers establecidos sobre "empleados" es habilitado:

select trigger_name, triggering_event, status


from user_triggers
where table_name = 'EMPLEADOS';

Los tres trigger establecidos sobre "empleados" han sido habilitados. Se activarán ante

cualquier sentencia "insert", "update" y "delete".

Listado completo de tutoriales


1 - Secuencias (create sequence - currval - nextval - drop sequence)

Hemos aprendido que existen varios objetos de base de datos, hasta ahora
hemos visto TABLAS y algunas FUNCIONES predefinidas. Otro objeto de base
de datos es la secuencia.

Una secuencia (sequence) se emplea para generar valores enteros secuenciales


únicos y asignárselos a campos numéricos; se utilizan generalmente para las
claves primarias de las tablas garantizando que sus valores no se repitan.

Una secuencia es una tabla con un campo numérico en el cual se almacena un


valor y cada vez que se consulta, se incrementa tal valor para la próxima
consulta.

Sintaxis general:
create sequence NOMBRESECUENCIA
start with VALORENTERO
increment by VALORENTERO
maxvalue VALORENTERO
minvalue VALORENTERO
cycle | nocycle;
- La cláusula "start with" indica el valor desde el cual comenzará la generación
de números secuenciales. Si no se especifica, se inicia con el valor que indique
"minvalue".

- La cláusula "increment by" especifica el incremento, es decir, la diferencia entre


los números de la secuencia; debe ser un valor numérico entero positivo o
negativo diferente de 0. Si no se indica, por defecto es 1.

- "maxvalue" define el valor máximo para la secuencia. Si se omite, por defecto


es 99999999999999999999999999.

- "minvalue" establece el valor mínimo de la secuencia. Si se omite será 1.

- La cláusula "cycle" indica que, cuando la secuencia llegue a máximo valor


(valor de "maxvalue") se reinicie, comenzando con el mínimo valor ("minvalue")
nuevamente, es decir, la secuencia vuelve a utilizar los números. Si se omite,
por defecto la secuencia se crea "nocycle".

Si no se especifica ninguna cláusula, excepto el nombre de la secuencia, por


defecto, comenzará en 1, se incrementará en 1, el mínimo valor será 1, el
máximo será 999999999999999999999999999 y "nocycle".

En el siguiente ejemplo creamos una secuencia llamada "sec_codigolibros",


estableciendo que comience en 1, sus valores estén entre 1 y 99999 y se
incrementen en 1, por defecto, será "nocycle":
create sequence sec_codigolibros
start with 1
increment by 1
maxvalue 99999
minvalue 1;

Si bien, las secuencias son independientes de las tablas, se utilizarán


generalmente para una tabla específica, por lo tanto, es conveniente darle un
nombre que referencie a la misma.

Otro ejemplo:
create sequence sec_numerosocios
increment by 5
cycle;

La secuencia anterior, "sec_numerosocios", incrementa sus valores en 5 y al


llegar al máximo valor recomenzará la secuencia desde el valor mínimo; no se
especifican las otras cláusulas, por lo tanto, por defecto, el valor mínimo es 1, el
máximo 999999999999999999999999999 y el valor inicial es 1.

Dijimos que las secuencias son tablas; por lo tanto se accede a ellas mediante
consultas, empleando "select". La diferencia es que utilizamos pseudocolumnas
para recuperar el valor actual y el siguiente de la secuencia. Estas
pseudocolumnas pueden incluirse en el "from" de una consulta a otra tabla o de
la tabla "dual".

Para recuperar los valores de una secuencia empleamos las pseudocolumnas


"currval" y "nextval".

Primero debe inicializarse la secuencia con "nextval". La primera vez que se


referencia "nextval" retorna el valor de inicio de la secuencia; las siguientes
veces, incrementa la secuencia y nos retorna el nuevo valor:

NOMBRESECUENCIA.NEXTVAL;

se coloca el nombre de la secuencia seguido de un punto y la pseudocolumna


"nextval" (que es una forma abreviada de "next value", siguiente valor).

Para recuperar el valor actual de una secuencia usamos:


NOMBRESECUENCIA.CURRVAL;

es decir, el nombre de la secuencia, un punto y la pseudocolumna "currval" (que


es una forma abreviada de "current value", valor actual).

Los valores retornados por "currval" y "nextval" pueden usarse en sentencias


"insert" y "update".

Veamos un ejemplo completo:

Creamos una secuencia para el código de la tabla "libros", especificando el valor


máximo, el incremento y que no sea circular:
create sequence sec_codigolibros
maxvalue 999999
increment by 1
nocycle;

Luego inicializamos la secuencia


select sec_codigolibros.nextval from dual;
Recuerde que la primera vez que se referencie la secuencia debe emplearse
"nextval" para inicializarla.

Ingresamos un registro en "libros", almacenando en el campo "codigo" el valor


actual de la secuencia:
insert into libros values
(sec_codigolibros.currval,'El aleph', 'Borges','Emece');

Ingresamos otro registro en "libros", almacenando en el campo "codigo" el valor


siguiente de la secuencia:
insert into libros values
(sec_codigolibros.nextval,'Matematica estas ahi', 'Paenza','Nuevo siglo');

Para ver todas las secuencias de la base de datos actual realizamos la siguiente
consulta:
select *from all_sequences;

Nos muestra el propietario de la secuencia, el nombre de la misma, los valores


mínimo y máximo, el valor de incremento y si es circular o no, entre otros datos
que no analizaremos por el momento.

También podemos ver todos los objetos de la base de datos actual tipeando;
select *from all_objects;

En la tabla resultado aparecen todos los objetos de la base de datos, incluidas


las secuencias; si es una secuencia en la columna OBJECT_TYPE se muestra
"SEQUENCE".

Podemos consultar "all_objects" especificando que nos muestre el nombre de


todas las secuencias:
select object_name from all_objects
where object_type='SEQUENCE';

Para eliminar una secuencia empleamos "drop sequence". Sintaxis:


drop sequence NOMBRESECUENCIA;

Si la secuencia no existe aparecerá un mensaje indicando tal situación.

En el siguiente ejemplo se elimina la secuencia "sec_codigolibros":


drop sequence sec_codigolibros;

Retornar

Вам также может понравиться