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

FORMATO DE GUÍA DE PRÁCTICA DE LABORATORIO / TALLERES /

CENTROS DE SIMULACIÓN – PARA DOCENTES

CARRERA: Ingeniería de Sistemas ASIGNATURA: Base de Datos 1


NRO. PRÁCTICA: 6-1 TÍTULO PRÁCTICA: Ligaduras de Integridad y Convenciones

OBJETIVO

 Conocer comprender las sentencias SQL vistos en clases con los ejercicios propuestos por el docente.
 Comprender las estructuras de las sentencias aplicadas en estos ejercicios.
 Con estos ejercicios resueltos

ACTIVIDADES POR DESARROLLAR


Resolución de los ejercicios propuestos.

LIGADURAS DE INTEGRIDAD Y CONVENCIONES

A continuación se presentan dos ejemplos de triggers: de validación y bitácora. Correr de


manera individual y generar un informe en el formato de práctica de laboratorio.
ENUNCIADO 1:

a) Trigger de validación que se ejecutará en el evento "before" y el caso de existir un error deberá existir
la sentencia:
raise_application_error (-20000, 'invalid department'
|| ' number' || to_char (: new. deptno));

Chequear el límite de empleados (por ej. 30) para un departamento cualquiera.


SOLUCIÓN DE LA CONSULTA SQL:
--Creado de un Trigger para el Limite de Empleados de Cada Departamento
CREATE OR REPLACE TRIGGER TR_LIMITE_EMPLEADO
--BEFORE sirve para la ejecucion del Trigger Antes de Insertar en la Tabla Empleados
BEFORE INSERT ON EMPLOYEES
--FOR EACH ROW sirve para la ejecucion de cada Fila
FOR EACH ROW
--Declaracion de la variables necesarias para la Ejecucion del Trigger
DECLARE
DEP_ID NUMBER;
NUM_EM NUMBER;
--Comienzo del Trigger
BEGIN
--Un Condiccional para mostrar los datos q se estan ingresaron dentro de la Tabla
IF INSERTING THEN
--DBMS_OUTPUT.PUT_LINE sirve para escribir dentro de la Consola
DBMS_OUTPUT.PUT_LINE (' INSERTANDO REGISTRO NUEVO: '||: NEW.FIRST_NAME ||' '||:
NEW.LAST_NAME);
END IF;
--SubConsulta que devuelve el numero de empleados por cada departamento y las guarda dentro
las variables creadas
SELECT EMP.DEPARTMENT_ID,
COUNT(EMP.EMPLOYEE_ID)
INTO DEP_ID, NUM_EM
FROM EMPLOYEES EMP
WHERE EMP.DEPARTMENT_ID =: NEW.DEPARTMENT_ID
GROUP BY EMP.DEPARTMENT_ID;
--Condiccional para la ejecucion si la variable numero de empleado es mayor o igual q 3 entonces
pondra un saturado
IF NUM_EM >= 3 THEN
DBMS_OUTPUT.PUT_LINE ('LIMITE DE EMPLEADOS POR DEPARTEAMENTO EXCEDIDO');
END IF;
--EXCEPCION cuando no exista un departamento o un departamento este vacio
EXCEPTION
WHEN NO_DATA_FOUND THEN
--RAISE_APPLICATION_ERROR es una excepcion de oracle que devuelve un codigo y un mensaje
de error no estandar
RAISE_APPLICATION_ERROR (-20000, 'DEPARTMENTO INVALIDO' || ' N°' || TO_CHAR
(: NEW.DEPARTMENT_ID));
END;

Ingreso de Nuevo Datos


SET SERVEROUTPUT ON
INSERT INTO EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME,
EMAIL, PHONE_NUMBER, HIRE_DATE,
JOB_ID, SALARY, COMMISSION_PCT,
MANAGER_ID, DEPARTMENT_ID)
VALUES (215, 'Ana','Quinde','@998','098765', SYSDATE,'SA_MAN',850,0, null,90);

Impresión del Resultado

ENUNCIADO 2:
Bitácora con auditoría sobre el sistema de cada grupo "por ejemplo con la tabla productos, con los campos
pro_id, pro_nombre, pro_precio". El Trigger se ejecutará en los eventos de "after": inserción, actualización
y borrado.

SOLUCIÓN DE LA CONSULTA SQL:


CREATE TABLE Audit_table (
Sequencia NUMBER,
Usuario VARCHAR2(100),
Fecha DATE,
Tabla VARCHAR2(100),
Proceso VARCHAR2(100),
PK_fila_afectada VARCHAR2(100));

CREATE TABLE Audit_table_values (


Sequencia NUMBER,
col_afectada VARCHAR2(100),
valor_old VARCHAR2(100),
valor_new VARCHAR2(100));

CREATE SEQUENCE Audit_seq;

CREATE OR REPLACE TRIGGER Audit_Productos


--AFTER despues de hacer insertando o actualizando o borrando
AFTER INSERT OR UPDATE OR DELETE ON PRODS
--Para cada Fila
FOR EACH ROW
--Comienzo del Triggers
BEGIN
--Guardando de los Cambios Hechos en las Tablas
--Condiccional cuando se inserta
IF INSERTING THEN
INSERT INTO Audit_table
VALUES (Audit_seq. NEXTVAL, USER, SYSDATE,
'PRODUCTOS', 'INSERT',:new.PRO_CODIGO);

--Condiccional cuando se borra


ELSIF DELETING THEN
INSERT INTO Audit_table
VALUES (Audit_seq. NEXTVAL, USER, SYSDATE,
'PRODUCTOS', 'DELETE',:old.PRO_CODIGO);
ELSE
--Sino es borrado entonces la tabla se actualiza
INSERT INTO Audit_table
VALUES (audit_seq. NEXTVAL, USER, SYSDATE,
'PRODUCTOS', 'UPDATE',:old.PRO_CODIGO);

--Guardando de los Valores Hechos en las Tablas


--Condiccional Cuando se actualiza y cambia algo dentro de la Tabla Precio del Producto y
guardando los valores nuevos y los establecidos
IF UPDATING ('PRO_PRECIO') THEN
INSERT INTO Audit_table_values
VALUES (Audit_seq. CURRVAL, 'PRECIO',
--Guardando del Precio Ingresado y el Nuevo Precio Cambiado
: old.PRO_PRECIO,:new.PRO_PRECIO);
--Condiccional Cuando se actualiza y cambio algo dentro de la Tabla Descripcion y guardando
los valores nuevos y los establecidos
ELSIF UPDATING ('PRO_DESCRIPCION') THEN
INSERT INTO Audit_table_values
VALUES (Audit_seq. CURRVAL, 'NOMBRE',
--Guardando de los Valores Cambiados
TO_CHAR(:old.PRO_DESCRIPCION),
TO_CHAR(:new.PRO_DESCRIPCION));
END IF;
END IF;
END;

--Creacion de la Tabla Prods cuando se Modifica


CREATE TABLE PRODS(
PRO_CODIGO NUMBER,
PRO_PRECIO NUMBER(6,2),
PRO_STOCK NUMBER,
PRO_DESCRIPCION VARCHAR(100),
TIENDAS_TIEN_CODIGO NUMBER
);
--Ingresando Datos dentro de la bases
INSERT INTO PRODS (PRO_CODIGO, PRO_PRECIO, PRO_STOCK, PRO_DESCRIPCION,
TIENDAS_TIEN_CODIGO)
VALUES (100,29.25,8,'Disco Duro',2);
INSERT INTO PRODS (PRO_CODIGO, PRO_PRECIO, PRO_STOCK, PRO_DESCRIPCION,
TIENDAS_TIEN_CODIGO)
VALUES (101,39.25,4,'DISCO DURO EXTERNO HDD',3);
INSERT INTO PRODS (PRO_CODIGO, PRO_PRECIO, PRO_STOCK, PRO_DESCRIPCION,
TIENDAS_TIEN_CODIGO)
VALUES (102,49.25,9,'Television Lcd',4);
--Cambios sobre el Precio
update PRODS PRO set PRO.PRO_PRECIO=PRO.PRO_PRECIO+1 where PRO.PRO_CODIGO=100;
update PRODS PRO set PRO.PRO_PRECIO=PRO.PRO_PRECIO+20 where PRO.PRO_CODIGO=101;
update PRODS PRO set PRO.PRO_PRECIO=PRO.PRO_PRECIO+2 where PRO.PRO_CODIGO=102;
--Cambios sobre la Descripción
update PRODS PRO set PRO.PRO_DESCRIPCION='TARGETA NVIDIA' where
PRO.PRO_CODIGO=101;
update PRODS PRO set PRO.PRO_DESCRIPCION='Television Led' where
PRO.PRO_CODIGO=102;
--Borrado de Datos
DELETE FROM PRODS PRO WHERE PRO.PRO_CODIGO=100;
Impresión del Resultado

SELECT * FROM PRODS;


SELECT * FROM AUDIT_TABLE;

SELECT * FROM AUDIT_TABLE_VALUES;

RESULTADO(S) OBTENIDO(S):
 Con la ayuda del SQL podemos mejoras nuestros conocimientos relacionados con la base de datos y obtener
resultados que a
 nosotros nos interese.
CONCLUSIONES:
Con este trabajo realizado en grupo podemos decir que con las sentencias SQL podemos manejar mejor el uso de la base
datos y
poder resolver problemas con tablas.

RECOMENDACIONES:

 Leer los libros y documentos para comprender las definiciones y la estructura de los script poder resolver los
problemas.

Realizado por: Andrés Bermeo


Revisado por : Andrés Bermeo

Firma:

________________________________________________

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