You are on page 1of 21

INSTITUTO POLITCNICO

NACIONAL
ESCUELA SUPERIOR DE
CMPUTO

ACADEMIA INGENIERA DE

SOFTWARE

Databases Selected Topics

Prctica no. 1:
Implementacin de restricciones en una base
de datos relacional

M. en C. Alejandro Botello Castillo

ALUMNO: ROA CASTELLANOS EDGAR

GRUPO: 3CM5

FECHA DE ENTREGA: 09/03/17


1. (Connected)
2. Se desbloquea la bdd (user altered)/ alter user hr identified by hr (user altered)
3. se desconecta
4. se conecta
5. set autocommit off;
6. set linesize 100;
7. set pagesize 50;
8. describe EMPLOYEES;
9. column constraint_name format A18;
10. column column_name format A18;
11. column search_condition format A25;
12. column delete_rule format A10;
13. select constraint_name, constraint_type, status, search_condition, delete_rule
from user_constraints where table_name = 'EMPLOYEES';

14. select uc.constraint_name, constraint_type, status, column_name from


user_constraints uc, user_cons_columns ucc where uc.constraint_name =
ucc.constraint_name and uc.table_name = 'EMPLOYEES';
solo dice las restricciones que tiene la tabla en sus atributos al ser alteradas

15. insert into employees(first_name, last_name) values ('Juan', 'Perez');


marca error por falta de valores debido a que unos son NOT NULL

16. insert into employees(employee_id, first_name, last_name, email) values


(1000,
'Juan', 'Perez', null);
marca error por falta de valores debido a que el email tiene la restriccion
NOT NULL

17. update employees set email = 'BERNST' where employee_id = 100;


viola el unique constraint de email (debe tener un valor y al querer
ingresarse uno nuevo marca error)
18. update employees set salary = -921.45 where employee_id = 100;
Viola la condicin donde dice que el salario tiene que ser mayor a 0

19. update employees set department_id = 400 where employee_id = 100;


Viola una restriccin de integridad en department

20. delete from departments where department_id = 10;


Al no existir un empleado con el id=10 marca error

21. update departments set department_id = 400 where department_name =


'Marketing';
Viola el manejo de integridad referencial

22. alter table employees disable constraint EMP_EMP_ID_PK;


No puede hacerlo debido a la dependencia que existe con la llave fornea
23. alter table employees disable constraint EMP_EMAIL_NN;
Deshabilito la restriccin de que los empleados necesariamente tengan un correo

24. alter table employees disable constraint EMP_HIRE_DATE_NN;

25. alter table employees disable constraint EMP_JOB_NN;

26. insert into employees(employee_id, first_name, last_name, email) values


(1000, 'Juan', 'Perez', null);
Lo pudo crear debido a que se deshabilitaron las restricciones que haban antes

27. rollback;
Deshace la sentencia insert delete, update//

28. alter table employees disable constraint EMP_EMAIL_UK;

29. update employees set email = 'BERNST' where employee_id = 100;


Actualiz el email porque existe el id 100
30. rollback;

31. alter table employees disable constraint EMP_SALARY_MIN;


Se desactivo la opcin de salario minimo

32. update employees set salary = -921.45 where employee_id = 100;


Al quitar la restriccin de salario minimo se actualiza a un salario negativo

33. rollback;

34. alter table employees disable constraint EMP_DEPT_FK;


Se desactivo la llave primaria de empleado departamento

35. update employees set department_id = 400 where employee_id = 100;


Se actualizo el identificador del empleado 100 asignndole el identificador 400

36. rollback;

37. delete from departments where department_id = 10;


Se elimin el departamento identificador nmero 10 de la tabla departamentos
38. rollback;

39. alter table job_history disable constraint JHIST_DEPT_FK;


Se deshabilita la llave primaria de la tabla job_history

40. update departments set department_id = 400 where department_name = 'Marketing';


Se actualiza el id al 400 para el departamento de marketing

41. rollback;

Ejecute las siguientes sentencias


1. alter table employees enable constraint EMP_EMP_ID_PK;
2. alter table employees enable constraint EMP_EMAIL_NN;
3. alter table employees enable constraint EMP_HIRE_DATE_NN;
4. alter table employees enable constraint EMP_JOB_NN;
5. alter table employees enable constraint EMP_EMAIL_UK;
6. alter table employees enable constraint EMP_SALARY_MIN;
7. alter table employees enable constraint EMP_DEPT_FK;
8. alter table job_history enable constraint JHIST_DEPT_FK;
Se modificaron las tablas
Modifique la definicin de las restricciones para que se cumpla lo siguiente:
a) El salario que gane un empleado deber estar comprendido entre $2,000 y
$30,000
alter table employees drop constraint EMP_SALARY_MIN;
alter table employees add constraint EMP_SALARY_MIN check(salary
between 2000 and 30000);

b) El correo electrnico del empleado deber ser obligatorio.

c) El nmero telefnico debe comenzar con la clave (01).


Alter table employees add constraint nombre_restriccion
check('01'=substr(phone_number 1,2);
alter table employees disable constraint nombre_restriccion;

d) El porcentaje de las comisiones no deber ser mayor del 50%.


alter table employees add constraint rcommission_pct
check(COMMISSION_PCT<=50);
select constraint_name, constraint_type, status, search_condition, delete_rule from
user_constraints where table_name = 'EMPLOYEES';

Segunda parte
11. select TO_CHAR( SYSDATE, 'YYYY-MM-DD HH24:MI:SS' ) as "Fecha y hora
actual" from dual;

12. select salary from employees where employee_id = 100;

13. update employees set salary = salary * 1.1 where employee_id = 100;
14. select salary from employees where employee_id = 100;

15. CREATE OR REPLACE PROCEDURE SECURE_DML


IS BEGIN
IF TO_CHAR (SYSDATE, 'HH24:MI') NOT BETWEEN '11:00' AND '11:30'
OR TO_CHAR (SYSDATE, 'DY') IN ('SAT', 'SUN')
THEN RAISE_APPLICATION_ERROR (-20205, 'Solo se pueden
hacer cambios en horas de oficina');
END IF;
END secure_dml;
/

16. rollback;
17. update employees set salary = salary * 1.1 where employee_id = 100;

18. alter trigger secure_employees disable;

Al querer actualizar nuevamente el salario dentro de las condiciones del


disparador nos enva un mensaje de error
19. alter trigger update_job_history enable;
20. select * from job_history;

21. update employees set job_id = PR_REP where employee_id = 100;

22. select * from job_history;

23. rollback;

Se agrega el registro debido a que posee las condiciones suficientes para


aadirse
24.
create or replace procedure aumenta_salario(v_id in
employees.employee_id%TYPE)
IS BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE employee_id = v_id;
END aumenta_salario;
/

25. show errors;

26. select salary from employees where employee_id = 100;

27. execute aumenta_salario(100);

28. select salary from employees where employee_id = 100;

29. rollback;
Se crea un procedimento y el mismo se ejecuta en el empleado 100 aumentando
su salario en un 10%
30.
create or replace procedure consulta_salario (v_id IN
employees.employee_id%TYPE, v_name OUT employees.last_name%TYPE,
v_sal OUT employees.salary%TYPE, v_com OUT
employees.commission_pct%TYPE)
IS BEGIN
SELECT last_name, salary, commission_pct INTO v_name, v_sal, v_com
from employees WHERE employee_id = v_id;
IF SQL%NOTFOUND THEN RAISE_APPLICATION_ERROR(-
20202, No existe el identificador de empleado);
END IF;
END consulta_salario;
/
31. show errors;

32. variable nomb varchar2(15)


33. variable sal number
34. variable com number
35. execute consulta_salario(100, :nomb, :sal, :com);

36. print nomb sal com

Se crea un procedimiento donde se consulta el nombre, salario y comisiones,


despus se ejecuta este procedimiento al empleado 100 donde aparecen sus
datos mencionados para ejecutar el procedimiento

37.
create or replace function obten_salario (v_id IN employees.employee_id%TYPE)
RETURN NUMBER
IS v_sal employees.salary%TYPE := 0;
BEGIN SELECT salary INTO v_sal FROM employees WHERE employee_id
= v_id;
RETURN v_sal;
END obten_salario;
/

38. show errors;


39. variable salario number;
40. execute :salario := obten_salario(100);

41. print salario;

Nos regresa el salario del empleado numero 100

42.
create or replace function impuesto(v_dato IN number)
RETURN number
IS impuesto number(3,2) := 0.16;
BEGIN
RETURN (v_dato * impuesto);
END impuesto;
/

43. show errors;

44. select employee_id, last_name, salary, impuesto(salary) from employees;

45. select object_name, object_type, created, status from user_objects;


46. select obj.object_name, object_type, status, line, text from user_objects obj, user_source src
where obj.object_name = src.name;

/*comentar*/

47. create or replace function impuesto(v_dato IN number) RETURN number

IS impuesto number(3,2) := 0.16; BEGIN

RETURN (v_dato * impuesto); END impuesto;

48. update employees set salary = 20000 where employee_id = 200;


Al empleado 200 se le agrega un salario de 20000
49. select view_name, text from user_views;

50. column city format A25;


51. select employee_id, first_name, last_name, salary, job_title, city from
emp_details_view where salary > 5000;
Muestra todos los empleados que ganan ms de 5000 arrojando 58 resultados
52. select employee_id, first_name, last_name, salary, job_title, city from
emp_details_view where salary > 5000 and city = Oxford;
Muestra todos los empleados que ganan ms de 5000 siendo de Oxford arrojando
34 resultados
53. select city, count(last_name), max(salary), min(salary), round(avg(salary))as
promedio from emp_details_view group by city;
Muestra por apellido a quienes viven en las distintas ciudades calculando su
salario mximo, mnimo y promedio siendo Oxford la mayor con 34 resultados
54. update emp_details_view set salary = salary * 1.1 where employee_id = 100;
Marca error por le restriccin antes declarada por medio de un trigger
55. describe user_updatable_columns;
Seala el nombre de las columnas del usuario updatable
56. select table_name, column_name, updatable, insertable, deletable from
user_updatable_columns;
Muestra las tablas y columnas sealando si pueden ser actualizables, adems de
saber si se pueden hacer inserciones y eliminacin de elementos.
57. select departments_seq.nextval from dual;
Seala el valor 280 de la tabla departments_seq en la columna nextval
58. select departments_seq.currval from dual;
Seala el valor 280 de la tabla departments_sqe en la columna currval
59. ALTER SEQUENCE departments_seq INCREMENT BY 20 MAXVALUE 9999
NOCACHE NOCACHE NOCYCLE;
Marca un error de duplicado por las especificaciones cache/nocache
60. insert into departments values (departments_seq.nextval, Education, null,
1700);
Se inserta un departamento de educacin en la tabla departments
61. select * from departments;
Se muestran todos los departamentos
62. ALTER SEQUENCE departments_seq INCREMENT BY 10 NOCACHE
NOCYCLE;
Se incrementan en 10 la secuencia de departments_seq
63. select * from departments;
Se muestran todos los departamentos
64. rollback;
Se regresa a los valores originales
65. select * from departments;
Se muestran todos los departamentos
66. select sequence_name, min_value, max_value, increment_by, last_number
from user_sequences;
Se muestran los incrementos de la entidad sequence_name

67.
CREATE OR REPLACE PACKAGE EMP_ADM AS
FUNCTION create_emp(first_name VARCHAR2, last_name VARCHAR2, email
VARCHAR2
phone_number VARCHAR2, hire_date DATE, job_id VARCHAR2, salary
NUMBER,
commission_pct NUMBER, manager_id NUMBER, department_id NUMBER)
RETURN NUMBER;
Se crea un paquete con la funcin crate_emp
68.
FUNCTION create_emp(first_name VARCHAR2, last_name VARCHAR2, email
VARCHAR2,
phone_number VARCHAR2, hire_date DATE, job_id VARCHAR2, salary
NUMBER,
commission_pct NUMBER, manager_id NUMBER, department_id NUMBER)
RETURN NUMBER;
Se crea la funcin create_emp
69.
FUNCTION create_dept(department_name VARCHAR2, manager_id NUMBER,
location_id NUMBER) RETURN NUMBER;
PROCEDURE remove_emp(employee_id NUMBER);
PROCEDURE remove_dept(department_id NUMBER);
END;
/
Cre la funcin con errores de compilacin

70.
CREATE OR REPLACE PACKAGE BODY "EMP_ADM" IS
tot_depts NUMBER;
tot_emps NUMBER;
FUNCTION create_dept(department_name VARCHAR2, manager_id NUMBER,
location_id NUMBER)
RETURN NUMBER
AS
new_deptno hr.employees.department_id%TYPE;
BEGIN
SELECT departments_seq.NEXTVAL
INTO new_deptno
FROM dual;
INSERT INTO hr.departments
VALUES (new_deptno, department_name, manager_id, location_id);
tot_depts := tot_depts + 1;
RETURN(new_deptno);
END CREATE_DEPT;

FUNCTION create_emp
(
FIRST_NAME IN VARCHAR2,
LAST_NAME IN VARCHAR2,
EMAIL IN VARCHAR2,
PHONE_NUMBER VARCHAR2,
HIRE_DATE IN DATE,
JOB_ID IN VARCHAR2,
SALARY IN NUMBER,
COMMISSION_PCT IN NUMBER,
MANAGER_ID IN NUMBER,
DEPARTMENT_ID IN NUMBER
)
RETURN NUMBER
AS
new_empno hr.employees.employee_id%TYPE;
BEGIN
SELECT employees_seq.NEXTVAL
INTO new_empno
FROM DUAL;
INSERT INTO hr.employees
VALUES (new_empno, first_name, last_name, email, phone_number, hire_date,
job_id, salary, commission_pct, manager_id, department_id);
tot_emps := tot_emps + 1;
RETURN(new_empno);
END create_emp;

PROCEDURE REMOVE_EMP(EMPLOYEE_ID IN NUMBER)


AS
BEGIN
DELETE FROM hr.employees
WHERE hr.employees.employee_id = employee_id;
tot_emps := tot_emps - 1;
END REMOVE_EMP;

PROCEDURE REMOVE_DEPT(DEPARTMENT_ID IN NUMBER)


AS
BEGIN
DELETE FROM hr.employees
WHERE hr.employees.employee_id = employee_id;
tot_emps := tot_emps - 1;
END REMOVE_DEPT;
END "EMP_ADM";
/
Se cre el paquete con errores de compilacin

DECLARE
new_emp_id NUMBER(6);
new_dept_id NUMBER(6);
BEGIN
new_emp_id := emp_adm.hire ('Belden', 'Enrique', 'EBELDEN@MAIL.COM',
'555.111.2222', SYSDATE, 'ST_CLERK', 2500, .1, 101, 110);
DBMS_OUTPUT.PUT_LINE('Empleado agregado: ' || TO_CHAR(new_emp_id));

SELECT * FROM hr.employees order by hr.employee_id desc;


new_dept_id := emp_adm.create_dept('new department', 100, 1700);
DBMS_OUTPUT.PUT_LINE('Departamento creado ' || TO_CHAR(new_dept_id));

SELECT * FROM hr.departments order by department_id desc;


emp_adm.remove_emp(new_emp_id);
DBMS_OUTPUT.PUT_LINE('Empleado eliminado: ' || TO_CHAR(new_emp_id));
emp_adm.remove_dept(new_dept_id);
DBMS_OUTPUT.PUT_LINE('Departamento eliminado: ' ||
TO_CHAR(new_dept_id));
END;
/

Cuestionario
1.- Mencione claramente las restricciones propias del modelo relacional y diga un
ejemplo que aplique en cada una de ellas.
a) Unicidad: Los valores de una columna no tiene duplicidad.

b) Nulidad: Algunos de los valores de un rengln pueden ser nulos (NULL)

c) Llave Primaria: Conjunto de columnas que cumplen las propiedades de


Unicidad y No Nulidad.

d) Lave Fornea: Conjunto de columnas que tienen una relacin con los
valores que pertenecen a otro conjunto de atributos de llave primaria de una
tabla externa.

2.- Describa las ventajas de los siguientes objetos de un SABD:


a) Procedimientos
b) Funciones
c) Disparadores

Generar algunos valores de columna derivados automticamente

Hacer cumplir la integridad referencial

Registro de eventos y almacenamiento de informacin sobre acceso a tablas

d) Auditora

Replicacin sncrona de tablas

Imposicin de autorizaciones de seguridad

Evitar transacciones invlidas

e) Vistas

Las vistas tienen la ventaja de que la declaramos solo una vez y cada vez que
necesitemos realizar una consulta de ciertos valores, ya no es necesario
declarar toda la consulta si ya tenemos una vista que nos ayude con ello.

3.- Describa como se aplican en un SABD mediante SQL, los siguientes


conceptos:
a) Restricciones
Unique: Las restricciones UNIQUE permiten valores NULL. Sin embargo, de
la misma forma que cualquier valor incluido en una restriccin UNIQUE,
solo se admite un valor NULL por columna.
Check: Las restricciones CHECK exigen la integridad del dominio mediante
la limitacin de los valores que puede aceptar una o varias columnas.
Puede crear una restriccin CHECK con cualquier expresin lgica
(booleana) que devuelva TRUE (verdadero) o FALSE (falso) basndose en
operadores lgicos.

b) Llave Primaria: La clusula PRIMARY KEY se utiliza para definir la clave


principal de la tabla. Las columnas que forman la clave principal no pueden
contener valores nulos ni puede haber valores duplicados de la
combinacin de columnas.

Llave Fornea: La clusula FOREIGN KEY sirve para definir una clave
fornea sobre una columna o una combinacin de columnas. Una clave
fornea es una columna o conjunto de columnas que contiene un valor que
hace referencia a una fila de otra tabla.
c) Regla de validacin de campo Puede utilizar una regla de validacin para
especificar un criterio que deben cumplir todos los valores de campo vlido.
Por ejemplo, un campo de fecha podra tener una regla de validacin que
no permita valores en el pasado.

Regla de validacin de registro Puede utilizar una regla de validacin para


especificar una condicin que deben cumplir todos los registros vlidos. Por
ejemplo, un registro con dos campos de fecha puede requerir que los
valores de un campo preceden siempre los valores del otro campo (por
ejemplo, StartDate es antes EndDate).

Validacin en un formulario Puede usar la propiedad Regla de validacin


de un control en un formulario para especificar un criterio que deben cumplir
todos los valores de entrada a dicho control. La propiedad de control de
Regla de validacin funciona como una regla de validacin de campo

Conclusiones
Dentro del desarrollo de la prctica pude notar el uso de las restricciones de tipo
check para delimitar las restricciones en los salarios de los empleados, as mismo
las sentencias y triggers para ejecutar lneas de cdigo, por ejemplo, cuando se
asign un sueldo negativo que no poda ser ingresado debido a un trigger.

You might also like