CREAR UN DISPARADOR QUE INSERTE POR DEFECTO LA INFORMACIÓN DEL USUARIO APEX EN VARIAS COLUMNAS DE UNA MISMA TABLA
En una aplicación que estaba realizando necesité insertar por defecto, en varias columnas en una misma tabla, la información del usuario. Me enfrentaba a varios problemas: la aplicación tenía su propio esquema de autenticación, es decir había una tabla que guardaba los atributos de los usuarios, necesitaba guardar la información del usuario en una tabla de transacciones cuya tabla padre era la tabla usuario por lo que no podía usar "DEFAULT USER" en la creación de la tabla como valor por defecto, además de que "USER" trae la información del usuario de base de datos y no de la aplicación como tal, ya que en Apex sería usuario ANONYMOUS.
Entonces lo único que se me ocurrió fue crear un disparador que hiciera esta tarea en el evento de un insert.
Se puede crear el disparador desde el asistente, click en la pestaña Taller de Sql, Explorador de Objetos
Click en el ícono de nuevo, escoger disparador
Se selecciona la tabla a la cual afectará el disparador y click en siguiente
Se escribe el nombre del separador (si no se quiere usar el que sugiere Apex), se selecciona el punto de arranque, el evento que activará el disparador y la columna que afectará, en mi caso no escojo un columna porque busco afectar a más de una, se escribe la condición que activará el disparador (opcional) y por último el cuerpo del disparador.
Click en Siguiente y click en Crear disparador y listo.
Aquí les dejo el disparador escrito si se quiere crear directamente desde el taller SQL--> comandos SQL con la explicación de lo que hace:
Create or replace trigger "DisparadorNuevo"
BEFORE
insert on "TablaDondeSeHaceInsert"
for each row
when (NEW.columnaPorDefecto1 IS NULL)
DECLARE
--En esta variable se guardará el nombre del usuario que suministrará 'APP_USER'
usuario varchar2(10);
--Como se trata de una clave foránea, aquí se guardará el id del usuario para ir a buscarlo a la tabla usuario.
id_usuario number(10);
BEGIN
-- se guardan en las variables la información del usuario.
select nvl(v('APP_USER'),USER) into usuario from dual;
select columnaId_Usuario into id_usuario from tablaUsuario where upper(columna_usuario)=usuario;
-- Se actualizan los campos que queremos que queden con el id del usuario cuando se haga el insert
--Aquí se puede insertar en tantas columnas como se quiera, en este caso quiero afectar 2 columnas
:new.columnaPorDefecto1 := id_usuario;
:new.columnaPorDefecto2 := id_usuario;
END;
/
Como siempre agradezco comentarios constructivos y observaciones.
Entonces lo único que se me ocurrió fue crear un disparador que hiciera esta tarea en el evento de un insert.
Se puede crear el disparador desde el asistente, click en la pestaña Taller de Sql, Explorador de Objetos
Click en el ícono de nuevo, escoger disparador
Se selecciona la tabla a la cual afectará el disparador y click en siguiente
Se escribe el nombre del separador (si no se quiere usar el que sugiere Apex), se selecciona el punto de arranque, el evento que activará el disparador y la columna que afectará, en mi caso no escojo un columna porque busco afectar a más de una, se escribe la condición que activará el disparador (opcional) y por último el cuerpo del disparador.
Click en Siguiente y click en Crear disparador y listo.
Aquí les dejo el disparador escrito si se quiere crear directamente desde el taller SQL--> comandos SQL con la explicación de lo que hace:
Create or replace trigger "DisparadorNuevo"
BEFORE
insert on "TablaDondeSeHaceInsert"
for each row
when (NEW.columnaPorDefecto1 IS NULL)
DECLARE
--En esta variable se guardará el nombre del usuario que suministrará 'APP_USER'
usuario varchar2(10);
--Como se trata de una clave foránea, aquí se guardará el id del usuario para ir a buscarlo a la tabla usuario.
id_usuario number(10);
BEGIN
-- se guardan en las variables la información del usuario.
select nvl(v('APP_USER'),USER) into usuario from dual;
select columnaId_Usuario into id_usuario from tablaUsuario where upper(columna_usuario)=usuario;
-- Se actualizan los campos que queremos que queden con el id del usuario cuando se haga el insert
--Aquí se puede insertar en tantas columnas como se quiera, en este caso quiero afectar 2 columnas
:new.columnaPorDefecto1 := id_usuario;
:new.columnaPorDefecto2 := id_usuario;
END;
/
Como siempre agradezco comentarios constructivos y observaciones.
Comentarios
Publicar un comentario