Está en la página 1de 43

UNIVERSIDAD NACIONAL MAYOR DE SAN

MARCOS
FACULTAD DE INGENIERÍA DE SISTEMAS E INFORMÁTICA

Proyecto para el curso de Base de Datos II, Grupo 102


TEMA:

PYOFICIO: SISTEMA WEB UTILIZANDO DJANGO


PARA SOLUCIONAR LA BAJA DEMANDA DEL
TRABAJO EN TIEMPOS DE COVID-19

INTEGRANTES:

Cuizano Cautivo, Silvia Yulisa 17200068


Mejia Quispe, Jonny Diego 17200236
Anchante Candia Juan Anyelo 10200143

PROFESOR:
Sotelo Bedón, Marcos

Lima, Perú 2020


ÍNDICE
Capítulo I. Introducción 3
1.1 Problemática 3
1.2 Solución 4
Capítulo II. Contenido 5
2.1 Modelado UML 5
2.1.1 Diagrama SQLServer 6
2.2 Mapeo UML-Relacional 6
2.3 Poblado de Datos 8
2.4 20 queries con grado de dificultad incremental 13
2.5 Encapsule una tabla crítica con SP 14
2.6 Elabore un SP orientado a toma de decisiones (utilice cursor) 18
2.7 Elabore un trigger para mantener un atributo redundante 19
2.8 Aplicación (prototipo) que muestre la integración con la BD 23
Capítulo III. Contenido Parte 2 26
3.1 Establezca la arquitectura de seguridad del DBS 26
3.2 Configure el control de acceso a la BD (Autenticación, autorización) 27
3.3 Gestión de riesgos 29
3.4 Evidencie la optimización de dos consultas (Queries) 33
3.5 Algebra operacional 39
Capítulo IV. Conclusiones 42

Capítulo V . Referencias bibliográficas 42


Capítulo I. Introducción

En el presente informe se abordará el proyecto PyOficio como un medio de apoyo para miles
de vecinos de San Martín de Porres, que se han visto afectados por la emergencia sanitaria
mundial, que tienen oficios y por lo tanto servicios que ofrecer y es difícil establecer contacto
con los clientes. A continuación se detalla el problema, la solución y se procede a detallar las
etapas que fueron necesarias para construir la página web, como son: diagramas UML,
diagrama E-R; los queries de creación de tablas, consultas, etc. Para ello utilizamos base de
datos Sql server, python con framework Django; para la interfaz gráfica los lenguajes
utilizados serán html, css y javascript.

1.1 Problemática
A causa del covid, el Ejecutivo ha estimado la pérdida de empleo de más de 1 millón de
trabajadores entre las microempresas (menos de 10 trabajadores) y las pequeñas empresas
(familias desempleadas). Según algunos especialistas, eso se debe principalmente a la falta de
liquidez para continuar con el negocio.

Las alternativas que tendrán las empresas serán el despido, la suspensión del contrato de
trabajo o la reducción de tiempo de trabajo, por ende reducción de sueldo. Ninguna de las
posibilidades es alentadora para la situación económica ya que se elevará la tasa de
desempleo.

Nuestro proyecto se centrará en ofrecer una solución tecnológica al desempleo en el país


mediante una red de comunicación entre las personas con oficios y sus clientes en tiempo de
covid.

3
1.2 Solución
Esta situación del trabajo en conjunto con el aislamiento social plantean un futuro diferente
para el empleo en nuestro país. Hay algunas ocupaciones y áreas que ya tienen una plataforma
para conseguir trabajo como el área de la informática, contabilidad, etc. Sin embargo hay
otras que no tienen esta facilidad, por lo tanto nuestro proyecto va dedicado a aquellos que les
afectó gravemente en su economía.

Las diez ocupaciones que más se demandarían bajo esta modalidad serían:

1. Carpintería
2. Albañilería
3. Pintura
4. Jardinería
5. Cerrajería
6. Sastrería
7. Gasfitería
8. Electricidad en el hogar
9. Mecánico de bicicletas
10. Servicio doméstico
Esto es un ejemplo de una plataforma similar a lo que queremos diseñar

Capítulo​ II. Contenido

2.1 Modelado UML

5
2.1.1 Diagrama SQLServer

2.2 Mapeo UML-Relacional


create database pyoficio
use pyoficio

--Create tables
CREATE TABLE Distrito(
id_distrito VARCHAR(10) PRIMARY KEY,
nombre VARCHAR(50),
)

CREATE TABLE Urbanizacion(


id_urb VARCHAR (10) PRIMARY KEY,
Descrip VARCHAR(50),
id_distrito1 VARCHAR(10),
CONSTRAINT fk_id1 FOREIGN KEY (id_distrito1) REFERENCES
Distrito(id_distrito)
)

CREATE TABLE Persona(


DNI VARCHAR(8) PRIMARY KEY,
nombres VARCHAR(50),
apellidos VARCHAR(50),
genero CHAR(1),
telefono VARCHAR(9),
email VARCHAR(20),
id_urb1 VARCHAR(10),
constraint fk_iu1 foreign key(id_urb1) references Urbanizacion(id_urb),
)
CREATE TABLE Perfil(
id_perfil VARCHAR(10) PRIMARY KEY NOT NULL,
titulo VARCHAR(50),
tiempo_exp INTEGER,
DNI1 VARCHAR(8) UNIQUE ,
CONSTRAINT fk_dn1 FOREIGN KEY( DNI1) REFERENCES Persona(DNI),
)

CREATE TABLE Habilidades(


id_habilidades VARCHAR(10) PRIMARY KEY,
nombre VARCHAR(20),
)

CREATE TABLE Oficio(


id_oficio VARCHAR(10) PRIMARY KEY,
nombre VARCHAR(50),

7
)

CREATE TABLE Portafolio(


id_portafolio VARCHAR (10) PRIMARY KEY,
Descrip VARCHAR(50),
Tiempo INTEGER,
Costo_prom INTEGER,
id_perfil3 VARCHAR(10),
CONSTRAINT fk_pf3 FOREIGN KEY (id_perfil3) REFERENCES Perfil(id_perfil)
)

CREATE TABLE Perfil_Hablidades(


id_perfil1 VARCHAR(10),
id_habilidades1 VARCHAR(10),
CONSTRAINT fk_ipf1 FOREIGN KEY (id_perfil1)REFERENCES Perfil(id_perfil),
CONSTRAINT fk_ih1 FOREIGN KEY (id_habilidades1) REFERENCES
Habilidades(id_habilidades),
)

CREATE TABLE Oficio_Perfil(


id_perfil2 VARCHAR(10),
id_oficio1 VARCHAR(10),
CONSTRAINT fk_ipf2 FOREIGN KEY (id_perfil2)REFERENCES Perfil(id_perfil),
CONSTRAINT fk_io1 FOREIGN KEY ( id_oficio1) REFERENCES
Oficio(id_oficio),
)

2.3 Poblado de Datos

-- inserccion de registros de la tabla Distrito--


insert into Distrito values('D-SMP','San Martin de Porres')

-- inserccion de registros de la tabla urbanizacion--

insert into Urbanizacion values('SMP-1','Perú 1257','D-SMP')


insert into Urbanizacion values('SMP-2','Proceres calle 1','D-SMP')
insert into Urbanizacion values('SMP-3','Los Libertadores','D-SMP')
insert into Urbanizacion values('SMP-4','Las flores 1532','D-SMP')
insert into Urbanizacion values('SMP-5','Pacifico 1497','D-SMP')

-- inserccion de registros de la tabla Oficio--

insert into Oficio values('OF-01','Carpinteria')


insert into Oficio values('OF-02','Mecanica')
insert into Oficio values('OF-03','Pintura')
insert into Oficio values('OF-04','Gasfiteria')
insert into Oficio values('OF-05','Jardineria')

-- inserccion de registros de la tabla Habilidades--

insert into Habilidades values('HA-01','Detallista')


insert into Habilidades values('HA-02','Pensamiento Logico')
insert into Habilidades values('HA-03','Pensamiento critico')

-- inserccion de registros de la tabla Persona--

insert into Persona


values('PE-01','Cristiano','Ronaldo','M','996265501','cr7@hotmail.com','SMP-1')
insert into Persona values('PE-02','Lionel','Messi','M','993452742','d10s@gmai.com','SMP-2')

9
insert into Persona
values('PE-03','Nathalia','Malaga','F','990972172','nm_grr@unmsms.com','SMP-3')
insert into Persona
values('PE-04','Roger','Federer','M','992004358','rf47@yahoo.com','SMP-4')
insert into Persona values('PE-05','Eva','Ayllon','F','997486298','ea69@upc.com','SMP-5')

insert into Persona values('PE-06','Cesar','Vega','M','990094635','cv-17@gmai.com','SMP-1')


insert into Persona
values('PE-07','Lucia','Cruz','F','992237559','lc_grr@unmsms.com','SMP-2')
insert into Persona values('PE-08','Ivan','Drago','M','995678436','id_xd@yahoo.com','SMP-3')
insert into Persona values('PE-09','rocky','Balboa','F','999876120','rb49@upc.com','SMP-4')
insert into Persona
values('PE-10','Hector','Chumpitas','M','979653827','hc0l0@hotmail.com','SMP-5')

insert into Persona


values('PE-11','flavia','Laos','F','900966395','fl-x100pre@gmai.com','SMP-1')
insert into Persona
values('PE-12','Michel','Soifer','F','922755969','ms_miau@unmsms.com','SMP-2')
insert into Persona
values('PE-13','Bruce','Lee','M','956784396','bl_record@yahoo.com','SMP-3')
insert into Persona values('PE-14','Chuck','Norris','M','998769123','rambo@upc.com','SMP-4')
insert into Persona
values('PE-15','Tito','Nieves','M','974538297','tn00@hotmail.com','SMP-5')

-- inserccion de registros de la tabla Perfil--

insert into Perfil values('PF-01','Carpintero',5,'PE-01')


insert into Perfil values('PF-02','Mecanico',3,'PE-02')
insert into Perfil values('PF-03','Pintor',1,'PE-03')
insert into Perfil values('PF-04','Gasfitero',2,'PE-04')
insert into Perfil values('PF-05','Jardinero',3,'PE-05')
insert into Perfil values('PF-06','Carpintero',3,'PE-06')
insert into Perfil values('PF-07','Mecanico',2,'PE-07')
insert into Perfil values('PF-08','Pintor',4,'PE-08')
insert into Perfil values('PF-09','Gasfitero',3,'PE-09')
insert into Perfil values('PF-10','Jardinero',1,'PE-10')

insert into Perfil values('PF-11','Carpintero',1,'PE-11')


insert into Perfil values('PF-12','Mecanico',2,'PE-12')
insert into Perfil values('PF-13','Pintor',3,'PE-13')
insert into Perfil values('PF-14','Gasfitero',4,'PE-14')
insert into Perfil values('PF-15','Jardinero',5,'PE-15')

-- inserccion de registros de la tabla Portafolio--

insert into Portafolio values('PO-01','Pintura exteriores por piso',1,100,'PF-03')


insert into Portafolio values('PO-02','Pintura exteriores por piso',3,80,'PF-08')
insert into Portafolio values('PO-03','Pintura exteriores por piso',2,90,'PF-13')

insert into Portafolio values('PO-04','Puertas interiores c/u cobrisa',1,150,'PF-01')


insert into Portafolio values('PO-05','Puertas interiores c/u caoba',1,120,'PF-06')
insert into Portafolio values('PO-06','Puertas interiores c/u cedro',1,170,'PF-11')

insert into Portafolio values('PO-07','Planchado y pintado por paño',2,150,'PF-02')


insert into Portafolio values('PO-08','Planchado y pintado por paño',2,170,'PF-07')
insert into Portafolio values('PO-09','Planchado y pintado por paño',2,190,'PF-12')

insert into Portafolio values('PO-10','Mantenimiento de jardin por m2',3,50,'PF-05')


insert into Portafolio values('PO-11','Mantenimiento de jardin por m2',2,70,'PF-10')
insert into Portafolio values('PO-12','Mantenimiento de jardin por m2',1,100,'PF-15')

11
insert into Portafolio values('PO-13','Cambio de tuberia por piso',2,210,'PF-04')
insert into Portafolio values('PO-14','Cambio de tuberia por piso',3,170,'PF-09')
insert into Portafolio values('PO-15','Cambio de tuberia por piso',2,200,'PF-14')

-- inserccion de registros de la tabla Perfil_Hablidades--

insert into Perfil_Hablidades values('PF-01','HA-01')


insert into Perfil_Hablidades values('PF-01','HA-02')
insert into Perfil_Hablidades values('PF-02','HA-01')
insert into Perfil_Hablidades values('PF-02','HA-03')
insert into Perfil_Hablidades values('PF-03','HA-01')
insert into Perfil_Hablidades values('PF-04','HA-01')
insert into Perfil_Hablidades values('PF-04','HA-02')
insert into Perfil_Hablidades values('PF-04','HA-03')

insert into Perfil_Hablidades values('PF-05','HA-01')


insert into Perfil_Hablidades values('PF-06','HA-02')
insert into Perfil_Hablidades values('PF-07','HA-01')
insert into Perfil_Hablidades values('PF-07','HA-03')
insert into Perfil_Hablidades values('PF-08','HA-01')
insert into Perfil_Hablidades values('PF-09','HA-01')
insert into Perfil_Hablidades values('PF-09','HA-02')
insert into Perfil_Hablidades values('PF-10','HA-03')

insert into Perfil_Hablidades values('PF-11','HA-01')


insert into Perfil_Hablidades values('PF-11','HA-02')
insert into Perfil_Hablidades values('PF-12','HA-01')
insert into Perfil_Hablidades values('PF-12','HA-03')
insert into Perfil_Hablidades values('PF-13','HA-01')
insert into Perfil_Hablidades values('PF-14','HA-01')
insert into Perfil_Hablidades values('PF-14','HA-02')
insert into Perfil_Hablidades values('PF-14','HA-03')
insert into Perfil_Hablidades values('PF-15','HA-01')
insert into Perfil_Hablidades values('PF-15','HA-02')

-- inserccion de registros de la tabla Oficio_Perfil--

insert into Oficio_Perfil values('PF-01','OF-01')


insert into Oficio_Perfil values('PF-02','OF-02')
insert into Oficio_Perfil values('PF-03','OF-03')
insert into Oficio_Perfil values('PF-04','OF-04')
insert into Oficio_Perfil values('PF-05','OF-05')

insert into Oficio_Perfil values('PF-06','OF-01')


insert into Oficio_Perfil values('PF-07','OF-02')
insert into Oficio_Perfil values('PF-08','OF-03')
insert into Oficio_Perfil values('PF-09','OF-04')
insert into Oficio_Perfil values('PF-10','OF-05')

insert into Oficio_Perfil values('PF-11','OF-01')


insert into Oficio_Perfil values('PF-12','OF-02')
insert into Oficio_Perfil values('PF-13','OF-03')
insert into Oficio_Perfil values('PF-14','OF-04')
insert into Oficio_Perfil values('PF-15','OF-05')

2.4 20 queries con grado de dificultad incremental


-- Queries basicos---
select * from Perfil where titulo = 'Carpintero';
select * from Persona order by DNI desc;
select nombres from Persona

13
where genero = 'M';
select 'Descripcion: El servicio de ' + Descrip + ' dura ' + tiempo + 's de trabajo y' + ' cuesta
en promedio menos de 100 soles)' from Portafolio
where Costo_prom < 100;
-- Queries usando having: este método solo lo podemos usar en este atributo y esta tabla ya
que es el único de tipo entero--
select Descrip,avg(Costo_prom) from Portafolio where Tiempo = 1
group by Descrip
having avg(Costo_prom) > 100
select Descrip,sum(Costo_prom) from Portafolio where Tiempo = 3
group by Descrip
having sum(Costo_prom) != 170
-- Queries usando inner join --
select nombres,apellidos,titulo,tempo_exp,Descrip,Costo_prom from Persona join Perfil on
Persona.DNI = Perfil.DNI1
join Portafolio on Perfil.id_perfil = Portafolio.id_perfil3

select Persona.nombres,apellidos,telefono,Descrip,Distrito.nombre from Persona join


Urbanizacion on Persona.id_urb1 = Urbanizacion.id_urb
join Distrito on Distrito.id_distrito = Urbanizacion.id_distrito1
where Descrip = 'Perú 1257'
-- Queries usando subconsultas --
select * from Persona where nombres = (select nombres from Persona where nombres =
'Cristiano')
select * from Portafolio where Descrip in (select Descrip from Portafolio where Costo_prom
< 100)

2.5 Encapsule una tabla crítica con SP

Tabla critica: tabla con información sensible que no podemos arriesgarnos a perder en este
caso como ejemplo tomaremos la tabla Persona

Encapsulamiento de tabla critica:​ restricción de acceso a datos sensibles


Caso:

Suponiendo que somos los administradores de la BD y un usuario necesita tener acceso a la


información de las mujeres de la tabla Persona, y nosotros como administradores en este
caso en particular sabemos que jamás podemos permitir que nadie tenga acceso a los
números telefónicos de la tabla Persona por ser información sensible, entonces solo
deberíamos darle la tabla con los accesos de datos permitidos.

Primero hacemos un SP para mostrar sólo datos de la tabla Persona los cuales deseamos
que el usuario tenga acceso

create​ ​procedure​ tablaCritica


@sexo ​varchar​ ​=​ ​'F'
as
select​ Persona​.​nombres​,​Persona​.​apellidos​,​Persona​.​email ​from​ Persona ​where​ genero ​=​ @sexo

La cual nos arrojara el siguiente resultado

Sin embargo existen sentencias que permiten saber que hay dentro de un SP; los datos de
cómo fue creado, las relaciones entre tablas, etc. Información a la que solo debería tener
acceso el administrador de la base de datos, información que podría resultar perjudicial en
las manos equivocadas. Sentencias como por ejemplo:

sp_help​ tablaCritica

Sin parámetros nos muestra todos los objetos de la base de datos seleccionada, incluidos
los procedimientos

15
sp_helptext​ tablaCritica

Nos muestra el texto que define el procedimiento

sp_stored_procedures​ tablaCritica

Muestra todos los procedimientos almacenados, los propietarios, etc.

sp_depends​ tablaCritica

Nos devuelve 2 resultados:

1) nombre, tipo, campos, etc. de los objetos de los cuales depende el objeto enviado.

2) nombre y tipo de los objetos que dependen del objeto nombrado.

Para poder restringir el acceso a esta información es necesario realizar una encriptación o
cifrado del SP.
Podemos eliminar (​drop​) el SP y volverlo a crear (​create​) o simplemente podemos alterarlo
mediante un ​alter​, como a continuación:

alter​ ​procedure​ tablaCritica


@sexo ​varchar​ ​=​ ​'F'
with​ ​encryption
as
select​ Persona​.​nombres​,​Persona​.​apellidos​,​Persona​.​email ​from​ Persona ​where​ genero ​=​ @sexo

Ahora si ingresamos las siguiente sentencia veremos que el resultado es otro

sp_helptext​ tablaCritica

Lo cual también se refleja en la pestaña de stored procedure, con una subpestaña de


nombre dbo.tablaCrtitica con un icono que se asemeja al de una vista pero con un candado
que hace referencia a la encriptación.

Si le damos click izquierdo a dicha sub pestaña podemos visualizar que la opción ​modificar
se encuentra deshabilitada

17
2.6 Elabore un SP orientado a toma de decisiones (utilice cursor)
CREATE PROCEDURE Mostrar_Personas_x_Urbanizacion
AS
BEGIN
declare cursorCP cursor
for select id_urb, Descrip from Urbanizacion
open cursorCP
declare @id varchar(10), @descrip varchar(50)
fetch next from cursorCP into @id,@descrip
while @@fetch_status=0
begin
print 'Urbanizacion : ' + @descrip
print '=================================='
declare cursorCP1 cursor
for select DNI, nombres, apellidos, genero, telefono, email from Persona where
id_urb1=@id
open cursorCP1
declare @dni varchar(50), @nomb varchar(50), @ape varchar(50), @gen char(1),
@tel varchar(10), @email varchar(30)
fetch next from cursorCP1 into @dni, @nomb, @ape, @gen, @tel, @email
while @@fetch_status=0
begin
print 'Dni : ' + @dni
print 'Nombres : ' + @nomb
print 'Apellidos : ' + @ape
print 'Genero : ' + @gen
print 'Telefono : ' + @tel
print 'Email : ' + @email
fetch next from cursorCP1 into @dni, @nomb, @ape, @gen, @tel, @email
end
close cursorCP1
deallocate cursorCP1

fetch next from cursorCP into @id,@descrip


end
close cursorCP
deallocate cursorCP
END

-- EJECUTAR PROCEDURE
EXEC Mostrar_Personas_x_Urbanizacion

2.7 Elabore un trigger para mantener un atributo redundante


CREATE TABLE AUDITA_PERSONA
(
DNI VARCHAR(8) ,
nombres VARCHAR(50),
apellidos VARCHAR(50),
genero CHAR(1),
telefono VARCHAR(8),
email VARCHAR(20),
id_distrito2 VARCHAR(10),
UPDATED_AT DATETIME NOT NULL,
USUARIO VARCHAR(50),
OPERATION CHAR(3) NOT NULL,
CHECK(OPERATION='INS' OR OPERATION='DEL' or OPERATION='UPD')
)

CREATE TABLE AUDITA_PORTAFOLIO


(

19
id_portafolio VARCHAR (10),
Descrip VARCHAR(50),
Tiempo VARCHAR(10),
Costo_prom INTEGER,
id_perfil4 VARCHAR(10),
UPDATED_AT DATETIME NOT NULL,
USUARIO VARCHAR(50),
OPERATION CHAR(3) NOT NULL,
CHECK(OPERATION='INS' OR OPERATION='DEL' or OPERATION='UPD')
)

CREATE TRIGGER TRG_AUDITA_PERSONA


ON PERSONA
AFTER INSERT, DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO AUDITA_PERSONA(
DNI, nombres, apellidos, genero, telefono, email, id_distrito2,
UPDATED_AT, USUARIO, OPERATION
)
SELECT i.DNI, i.nombres, i.apellidos, i.genero, i.telefono, i.email, id_distrito2,
GETDATE(), USER_NAME(USER_ID()), 'INS'
FROM
inserted i
WHERE NOT EXISTS(SELECT * FROM deleted)
UNION ALL
SELECT d.DNI, d.nombres, d.apellidos, d.genero, d.telefono, d.email, id_distrito2,
GETDATE(), USER_NAME(USER_ID()), 'DEL'
FROM
deleted d
WHERE NOT EXISTS(SELECT * FROM INSERTED)
UNION ALL
SELECT
i.DNI,
i.nombres,
i.apellidos,
i.genero,
i.telefono,
i.email,
id_distrito2,
GETDATE(),
USER_NAME(USER_ID()),
'UPD'
FROM INSERTED i
WHERE EXISTS (SELECT * FROM DELETED)
END

CREATE TRIGGER TRG_AUDITA_PORTAFOLIO


ON PORTAFOLIO
AFTER INSERT, DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO AUDITA_PORTAFOLIO(
id_portafolio, Descrip, Tiempo, Costo_prom, id_perfil4,
UPDATED_AT,
USUARIO,
OPERATION
)
SELECT i.id_portafolio, i.Descrip, i.Tiempo, i.Costo_prom, i.id_perfil4,

21
GETDATE(),
USER_NAME(USER_ID()),
'INS'
FROM
inserted i
WHERE NOT EXISTS(SELECT * FROM deleted)
UNION ALL
SELECT
d.id_portafolio,
d.Descrip,
d.Tiempo,
d.Costo_prom,
d.id_perfil4,
GETDATE(),
USER_NAME(USER_ID()),
'DEL'
FROM
deleted d
WHERE NOT EXISTS(SELECT * FROM INSERTED)
UNION ALL
SELECT
i.id_portafolio,
i.Descrip,
i.Tiempo,
i.Costo_prom,
i.id_perfil4,
GETDATE(),
USER_NAME(USER_ID()),
'UPD'
FROM INSERTED i
WHERE EXISTS (SELECT * FROM DELETED)
END
2.8 Aplicación (prototipo) que muestre la integración con la BD
Crear entorno Django y el proyecto
• Crear entorno virtual
$ virtualevn “Testing”
• Entrar
$ Source testing// activar entorno
• Instalar Django
$ pip install django
• Verificar instalacion con pip Freeze
$ pip freeze
• Crear proyecto
$ Django-admin startproject laboratorio5
• Ejecutar Servidor
$ Python.py runserver
• Crear app
$ python manage.py startapp talento
Mapeo Django

Creando modelos

Distrito

class​ ​PyDistrito​(​models​.​Model​):
name = models.CharField(_(​"Nombre"​), ​max_length​=​80​)
description = models.TextField(_(​"Description"​), ​blank​=​True​,
null​=​True​)

​def​ ​__str__​(​self​):
​return​ ​format​(​self​.name)

23
​class​ ​Meta​:
verbose_name = _(​"Distrito"​)
verbose_name_plural = _(​"PyDistrito"​)

Oficio

class​ ​PyOficio​(​models​.​Model​):
name = models.CharField(_(​"Name"​), ​max_length​=​80​)
description = models.TextField(_(​"Description"​), ​blank​=​True​,
null​=​True​)
img = models.ImageField(
​max_length​=​255​,
​storage​=RenameImage(),
​upload_to​=image_path,
​blank​=​True​,
​null​=​True​,
​default​=​'oficio/default_oficio.png'
)
​def​ ​__str__​(​self​):
​return​ ​format​(​self​.name)

​class​ ​Meta​:
verbose_name = _(​"Oficio"​)
verbose_name_plural = _(​"PyOficio"​)

Persona
class​ ​PyUser​(​AbstractUser​):
​'''Modelo de los usuarios
'''
username = ​None
email = models.EmailField(_(​"Email"​), ​max_length​=​254​, ​null​=​False​,
db_index​=​True​, ​unique​=​True​)
USERNAME_FIELD = ​'email'
REQUIRED_FIELDS = []

objects = PyUserManager()

first_name = models.CharField(_(​"Name"​), ​max_length​=​30​)


last_name = models.CharField(_(​"Last name"​), ​max_length​=​30​,
blank​=​True​, ​null​=​True​)
celular = models.CharField(_(​"Mobile Phone"​), ​max_length​=​255​,
blank​=​True​, ​null​=​True​)
avatar = models.ImageField(​max_length​=​255​, ​storage​=RenameImage(),
upload_to​=image_path, ​blank​=​True​, ​null​=​True​,
default​=​'avatar/default_avatar.png'​)

​def​ ​__str__​(​self​):
​return​ ​'​{}​ ​{}​'​.format(​self​.first_name, ​self​.last_name)

​def​ ​get_full_name​(​self​):
​return​ ​'​%s​ ​%s​'​ % (​self​.first_name, ​self​.last_name)

​class​ ​Meta​:
verbose_name = _(​'Person'​)
verbose_name_plural = _(​'People'​)

Persona Oficio
class​ ​PyPersonaOficio​(​models​.​Model​):

persona = models.OneToOneField(PyUser,
​blank​ = ​False​,
​null​ = ​False​,
​verbose_name​=_(​"Usuario"​),

25
​on_delete​=models.PROTECT)

oficios = models.ManyToManyField(PyOficio,
​blank​ = ​False​,
​null​ = ​False​,
​verbose_name​=_(​"Oficios"​))

experiencia = models.IntegerField(_(​"Años de experiencia"​),


blank​=​True​, ​null​=​True​)

​def​ ​__str__​(​self​):
​return​ ​format​(​self​.persona)

​class​ ​Meta​:
verbose_name = _(​"PersonaOficio"​)
verbose_name_plural = _(​"PyPersonaOficio"​)

Capítulo III. Contenido Parte 2


3.1 Establezca la arquitectura de seguridad del DBS

PARTE I: PRIVILEGIOS 
En cada celda de la matriz, consigne los privilegios para cada usuario y luego implemente en 
el gestor de BD. 
Usr/Objeto  PuestoSol​1  CompSol  calProductos)  callRegister() 

Admin  Profesional  1. Administra las  si  si 


verificaciones y el dominio 
de la organizacion 
2. Crud de productos y de 
Personas sin restricciones. 
 

Ofertante  Usuario  1. Crud de productos y  si  si 


sepuede editar su perfil.   
2. rol de expectante 

Expectante  Usuario  1. Ver productos ofertados y  si  no 


busca productos ofertados.   
2. Puede crearse una cuenta y 
logearse 
 
 
Sesión de Administrador: 
1. Administra las verificaciones y el dominio de la organizacion 
2. Crud de productos y de Personas sin restricciones. 
 
Sesion de Ofertante. 
1. Crud de productos y sepuede editar su perfil. 
2. rol de expectante 
 
Sesión de Expectante 
1. Ver productos ofertados y busca productos ofertados. 
2. Puede crearse una cuenta y logearse 

3.2 Configure el control de acceso a la BD (Autenticación,


autorización)

27
3.3 Gestión de riesgos

Categoría / Descripción Amenaza Control recomendado


Subcateg
del Riesgo

Servidor Soporte - Los cibercriminales, hackers, Malware 1. Evitar el uso de software


de Base Software
utilizan ataques avanzados pirata tanto en los equipos de
de Datos
que combinan múltiples los usuarios como en
técnicas, tales como spear servidores.
phishing y malware para
penetrar en las organizaciones 2. Restringir el acceso de la
y robar sus datos base de datos a la red
confidenciales. externa, Internet, permitiendo
solo acceso desde y hacia la
red interna de la compañía,
evitando conexiones
indeseadas.

3. Evitar otorgar permisos de


superusuario o administrador
de base de datos (rol DBO) a
los usuarios

Cuando a alguien se le Falta de Hacer uso del manejo de la


experiencia del
otorgan privilegios de base de asignación de permisos
DBA en la
datos que exceden los gestión de
mediante roles, en vez de
requerimientos de su puesto asignación de asignarlos directamente al
privilegios usuario

29
de trabajo, se crea un riesgo
innecesario

Es cuando un usuario interno, Algún usuario Realizar una revisión de los


con credenciales autorizadas y haciendo uso planes de auditoría
indebido de sus
permisos definidos para la configurados a la base de
privilegios
ejecución de sus labores en la datos en busca de patrones
compañía, hace uso de estos de conexión anómalos, por
para beneficio personal y/o de ejemplo conexiones,
terceros ajenos a la empresa consultas fuera de horarios
laborales y actualización o
eliminación de registros.

Activo Categoría-/ Descripción Amenaza Control recomendado


Subcateg
del Riesgo

Proceso Calidad - Si los requerimientos no han sido Definición de Validar los requerimientos
de Software definidos adecuadamente, es requerimientos definidos mediante prototipos a los
proyecto probable que se exceda el usuarios finales
cronograma y el costo.

Si el presupuesto inicial planteado Falta de Ante un cambio del presupuesto,


para el proyecto, excede el presupuesto se planteará un cambio al plan de
establecido o si la organización se costos y documentos asociados.
queda sin fondos, el alcance y la Ante un quiebre de fondos, el
calidad del proyecto se verán proyecto será paralizado.
afectados
Si se aceptan cambios sin evaluar Gestión de Evaluar el impacto de cada
adecuadamente el impacto que cambios petición de cambio y consultar su
puedan presentar, el alcance, el factibilidad con el desarrollador
cronograma y los costos se podrán principal, el gerente de proyectos y
ver afectados. demás miembros de equipo

Si los desarrolladores no están Capacidad de Conformar al equipo por


preparados adecuadamente para el desarrolladores desarrolladores con experiencia
desarrollo del proyecto, el alcance, el suficiente y comunicarse
cronograma y la calidad se verán constantemente con ellos para
mermadas. prevenir dificultades

ANÁLISIS CUALITATIVO DE RIESGOS

ESCALA PROBABILIDAD

MUY ALTO La probabilidad de ocurrencia es de 2 veces por semana


(4)

ALTO (3) La probabilidad de ocurrencia es de 1 vez semana

MEDIO (2) La probabilidad de ocurrencia es de 1 vez por mes

BAJO (1) La probabilidad de ocurrencia es de 1 vez al año

ESCALA IMPACTO

ALTO (4) De suceder las consecuencias serían catastróficas

ALTO (3) De suceder las consecuencias serían manejables

MEDIO (2) De suceder las consecuencias serían tolerables

BAJO (1) De suceder las consecuencias serían mínimas


ANÁLISIS CUALITATIVO DE RIESGOS

31
ID Riesgo Probabilidad Impacto Evaluación

R1 Malware 4 4 16

R2 Falta de experiencia del DBA 2 3 6


en la gestión de privilegios

R3 Algún usuario haciendo uso 3 4 12


indebido de sus privilegios

R4 Definición de requerimientos 1 4 4

R5 Falta de presupuesto 1 3 3

R6 Gestión de cambio 2 2 4

R7 Capacidad de desarrolladores 1 1 1

MATRIZ DE RIESGO

P
R
O
B 4 R1
A
B
I 3 R2 R3
L
I
D 2 R6
A 1 R7 R5 R4
D

1 2 3 4

IMPACTO

3.4 Evidencie la optimización de dos consultas (Queries)


Se refiere a mejorar los tiempos de respuesta en un sistema de gestión de bases de
datos relacional, pues la ​optimización es el proceso de modificar un sistema para
mejorar su eficiencia o también el uso de los recursos disponibles.

Recomendaciones:

1. En la cláusula SELECT, utilice únicamente las columnas necesarias, evitar *

2. Utilice una cláusula WHERE, para filtrar y devolver solo las filas necesarias

3. En el predicado del where evitar expresiones que manipulen columnas

4. Utilizar lo menos posibles tablas temporales.

5. Evitar el uso de cursores.

6. Aplicar índices de manera correcta.

Ejemplo:

33
Hacer las consultas lo más simples posibles, o sea obtener un resultado sin un gran
nivel de complejidad, ejemplo, si queremos visualizar los datos de la tabla Personas
con sus respectivas dirección de la tabla Urbanización.

Método A – usando cursores

CREATE​ ​PROCEDURE​ Mostrar_Personas_x_Urbanizacion

AS

BEGIN

declare​ cursorCP ​cursor

for​ ​select​ id_urb​,​ Descrip ​from​ Urbanizacion

open​ cursorCP

declare​ @id ​varchar​(​10​),​ @descrip ​varchar​(​50​)

fetch​ ​next​ ​from​ cursorCP ​into​ @id​,​@descrip

while​ ​@@fetch_status​=​0

begin

print​ ​'Urbanizacion : '​ ​+​ @descrip

print​ ​'=================================='

declare​ cursorCP1 ​cursor

for ​select DNI​, nombres​, apellidos​, genero​, telefono​, email ​from Persona
where​ id_urb1​=​@id

open​ cursorCP1

declare @dni ​varchar​(​50​), @nomb ​varchar​(​50​), @ape ​varchar​(​50​), @gen


char​(​1​),​ @tel ​varchar​(​10​),​ @email ​varchar​(​30​)

fetch​ ​next​ ​from​ cursorCP1 ​into​ @dni​,​ @nomb​,​ @ape​,​ @gen​,​ @tel​,​ @email

while​ ​@@fetch_status​=​0

begin

print​ ​'Dni : '​ ​+​ @dni


print​ ​'Nombres : '​ ​+​ @nomb

print​ ​'Apellidos : '​ ​+​ @ape

print​ ​'Genero : '​ ​+​ @gen

print​ ​'Telefono : '​ ​+​ @tel

print​ ​'Email : '​ ​+​ @email

fetch​ ​next​ ​from​ cursorCP1 ​into​ @dni​,​ @nomb​,​ @ape​,​ @gen​,​ @tel​,​ @email

end

close​ cursorCP1

deallocate​ cursorCP1

fetch​ ​next​ ​from​ cursorCP ​into​ @id​,​@descrip

end

close​ cursorCP

deallocate​ cursorCP

END

EXEC​ Mostrar_Personas_x_Urbanizacion

35
​---------------------------------Plan de ejecución-------------------------------
37
Método B – usando iner join

Select DNI​, nombres​, apellidos​, genero​, telefono​, email​, Descrip ​from Persona ​join
Urbanizacion ​on​ Persona​.​id_urb1 ​=​ Urbanizacion​.​id_urb

---------------------------------Plan de ejecución-------------------------------

En el caso del método B vemos un mejor uso recursos, ahorrando memoria, y el


tiempo de ejecución es menor por ser una sentencia no muy compleja de ejecutar
para el motor de base de datos, lo cual también se puede ver reflejado en el plan de
ejecución.

Plan de ejecución

Diagrama de procesos de ejecución de la consulta a través de iconos, incluye


información sobre el acceso a las tablas, índices. Se presentan de forma gráfica, hay
dos tipos:

1. Ejecución estimado que no ejecuta la consulta

2. Plan de ejecución real que se devuelve después de que ya se ejecutó la


consulta.

Es importante aprender a leer que significa cada icono para poder monitorear bien el
camino que está tomando el SQL en relación a las consultas, a continuación algunos
iconos que apreciamos en nuestra consulta.
El icono clustured table_scan, recorre toda la tabla de página en página buscando el
dato, lo cual no es una manera óptima de hacer la consulta. Esto se da cuando la
tabla es creada a partir de los datos sin tener en cuenta llaves primarias, foráneas, y
estar referenciados por índices.

El icono Clustured Index_scan, es más eficiente que el clustured table_scan, pero


igual implica un recorrido de datos pero ahora dentro de un índice, igual e le
considera una manera no óptima de hacer una consulta

El icono Clustured Index_seek, a través de un índice, localiza rápidamente el dato


solicitado, como en nuestro caso, ya que nuestra tabla tiene bien definidos sus llaves
primarias, llaves foranes, y demás valores y esto hace más eficiente la consulta.

Como nuestra tabla no tiene mucha data cargada no se puede llegar a diferenciar la
diferencia entre Clustured Index_seek y clustured table_scan, sin embargo cuando
hay data extensa si se visualiza la diferencia ya que mientras uno solo busca en
base a índices el otro tiene que recorrer toda la tabla para ubicar los datos
solicitados

3.5 Algebra operacional


Usando Joins para enlazar Usuario con Productos

N° JOIN OPERADOR ÁLGEBRA RELACIONAL

39
1 INNER Persona ​ ⋂ ​Productos

2 LEFT ​Persona​⟕​Productos

3 RIGHT Persona​⟖​Productos

4 OUTER Persona ​⟗​ Productos

5 OUTER MINUS (Persona<Condición>) ∆ (​Productos​ <condición>)

6 LEFT MINUS (Persona<Condición>)​⟕ ​Productos

7 RIGHT MINUS Persona​ ​⟖​(​ ​Productos​<condición>)

8 CROSS Persona​ × Productos

9 SELF persona!

Aqui mostramos el perfil de un usuario registrado.


Ingresamos un nuevo producto

41
Capítulo IV. Conclusiones
Durante el tiempo que nos tomó desarrollar el proyecto PYOFICIO, el mismo que fue
abordado por etapas nos ayudó a parte de añadir funcionalidades , darle seguridad a nuestra
base de datos, aquí la importancia. Asimismo la álgebra operacional nos ayudó a trabajar de
manera exacta y nos brindó las habilidades necesarias para recabar información de nuestro
interés.
Por lo tanto el temas de Bases de Datos nos ayudó tener un sistema para conectar usuarios y
trabajadores, así el usuario solo tiene vista de los productos, pero si desea puede loguearse y
ser partícipe del staff de trabajadores que brindan sus servicios.

Capítulo V . Referencias bibliográficas

● Creación de Sitios Web con SQL Server 7​ – Jeffrey Byrne – Prentice


Hall – 2000.
● https://manuales.guebs.com/mysql-5.0/triggers.html
● Fundamentos de Bases de Datos​ ​– Silberschatz Abraham – Korth Henry
F. – Sudarshan – Mc Graw Hill (5º Edición) –2006
● https://docs.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver15
● https://www.geeksforgeeks.org/dbms/
● https://docs.djangoproject.com/en/3.1/
https://pythonizame.s3.amazonaws.com/media/Book/guia-definitiva-django-18/f
ile/34ba425e-5985-11e5-964d-04015fb6ba01.pdf

43

También podría gustarte