· 4 years ago · Jul 27, 2021, 04:28 PM
1
2--- Borrado de tablas
3drop table IF EXISTS producto cascade;
4drop table IF EXISTS sub_prod cascade;
5drop table IF EXISTS problema cascade;
6drop table IF EXISTS desarrollador cascade;
7
8--- Script para crear las tablas
9create table producto (
10id_producto varchar(5) not null,
11descripcion varchar(80) not null,
12fecha_cierre timestamp,
13constraint pk_producto primary key(id_producto)
14);
15create table sub_prod (
16id_sub_prod int not null,
17id_producto varchar(5) not null,
18descripcion varchar(80) not null,
19version_cerrada numeric(10,2) not null,
20constraint pk_sub_prod primary key(id_sub_prod, id_producto)
21);
22create table problema (
23id_problema int not null,
24id_sub_prod int not null,
25id_producto varchar(5) not null,
26id_equ_reporta char(1) not null,
27id_des_reporta int not null,
28id_equ_a_cargo char(1),
29id_des_a_cargo int,
30fecha_reporte timestamp not null,
31descripcion varchar(80) not null,
32fecha_cierre timestamp,
33cantidad_horas numeric(10,2) not null,
34constraint pk_problema primary key(id_problema)
35);
36create table desarrollador(
37id_equipo char(1) not null,
38id_desar int not null,
39nombre varchar(80) not null,
40apellido varchar(80) not null,
41e_mail varchar(120),
42fecha_ingreso timestamp not null,
43salario numeric(10,2),
44constraint pk_desarrollador primary key(id_equipo, id_desar)
45);
46alter table sub_prod add constraint fk1 foreign key (id_producto) references producto(id_producto) on delete cascade on update cascade;
47alter table problema add constraint fk2 foreign key (id_sub_prod, id_producto) references sub_prod (id_sub_prod, id_producto) on delete restrict on update cascade;
48alter table problema add constraint fk_reporta foreign key(id_equ_reporta, id_des_reporta) references desarrollador(id_equipo, id_desar) on delete cascade on update cascade;
49alter table problema add constraint fk_aCargo foreign key(id_equ_a_cargo, id_des_a_cargo) references desarrollador(id_equipo, id_desar) on delete set null on update set null;
50-- Inserts
51insert into producto (id_producto, descripcion, fecha_cierre) values ('P1','Producto 1', to_date('02/26/2016','dd/MM/yyyy'));
52insert into producto (id_producto, descripcion, fecha_cierre) values ('P2','Producto 2', null);
53insert into sub_prod (id_sub_prod, id_producto, descripcion, version_cerrada) values (1, 'P1', 'Descripción Sub Producto 1-P1', 2.3);
54insert into sub_prod (id_sub_prod, id_producto, descripcion, version_cerrada) values (2, 'P1', 'Descripción Sub Producto 2-P1', 2.7);
55insert into sub_prod (id_sub_prod, id_producto, descripcion, version_cerrada) values (3, 'P1', 'Descripción Sub Producto 3-P1', 3.2);
56insert into desarrollador(id_equipo, id_desar, nombre, apellido, e_mail, fecha_ingreso, salario) values ('A', 1, 'Juan', 'Perez', 'jperez@gmail.com', to_date('2/1/2005','dd/MM/yyyy'), 10000);
57insert into desarrollador(id_equipo, id_desar, nombre, apellido, e_mail, fecha_ingreso, salario) values ('A', 2, 'Jhon', 'Doe', 'jdoe@gmail.com', to_date('1/2/2005','dd/MM/yyyy'), 11000);
58insert into desarrollador(id_equipo, id_desar, nombre, apellido, e_mail, fecha_ingreso, salario) values ('A', 3, 'Juana', 'Perez', 'japerez@gmail.com', to_date('2/1/2003','dd/MM/yyyy'), 12000);
59insert into desarrollador(id_equipo, id_desar, nombre, apellido, e_mail, fecha_ingreso, salario) values ('B', 1, 'Jane', 'Doe', 'jadoe@gmail.com', to_date('2/1/2007','dd/MM/yyyy'), 13000);
60insert into problema(id_problema, id_sub_prod, id_producto, id_equ_reporta, id_des_reporta, id_equ_a_cargo, id_des_a_cargo, fecha_reporte, descripcion, fecha_cierre, cantidad_horas) values
61(1, 1, 'P1', 'A', 1, null, null, to_date('1/5/2010','dd/MM/yyyy'), 'No funciona la pantalla de login', to_date('8/5/2010','dd/MM/yyyy'), 20);
62insert into problema(id_problema, id_sub_prod, id_producto, id_equ_reporta, id_des_reporta, id_equ_a_cargo, id_des_a_cargo, fecha_reporte, descripcion, fecha_cierre, cantidad_horas) values
63(2, 2, 'P1', 'A', 2, 'A', 1, to_date('1/6/2011','dd/MM/yyyy'), 'No funciona la pantalla de CC', to_date('8/6/2011','dd/MM/yyyy'), 10);
64insert into problema(id_problema, id_sub_prod, id_producto, id_equ_reporta, id_des_reporta, id_equ_a_cargo, id_des_a_cargo, fecha_reporte, descripcion, fecha_cierre, cantidad_horas) values
65(3, 3, 'P1', 'A', 1, 'A', 2, to_date('1/5/2013','dd/MM/yyyy'), 'No funciona el AMB de Cliente', to_date('8/5/2013','dd/MM/yyyy'), 50);
66
67----
68/*
69EJERCICIO 1
70Las modalidades para Borrado y Modificación a derecha para cada una de las restricciones de integridad referencial son las siguientes:
71FK1: (cascade, cascade) - FK2: (restrict, cascade) - FK_Reporta: (cascade, cascade) - FK_aCargo: (null, null) match simple
72Suponga que la BD está instanciada sólo con las tuplas adjuntas en este ejercicio.
73Explique el efecto de las siguientes sentencias sobre cada tabla de la BD, haciendo clara referencia a las RIR que se activan en cada caso (NOTA: en cada caso considere el efecto sobre la INSTANCIA ORIGINAL de la BD, los resultados NO SON ACUMULATIVOS):
74a) DELETE FROM PRODUCTO WHERE id_producto = 'P1'; */
75
76Las RIR que se activan son FK1 - cascade y FK2 - restrict. Se intentaría borrar el producto cuyo id_producto es P1 y todos los registros de sub_prod (P1,1 ; P1,2 y P1,3) pero todos estan siendo referenciados desde problema.
77
78--b) UPDATE PRODUCTO SET id_producto = 'P3' WHERE id_producto = 'P1';
79Las RIR que se activan son FK1 - cascade y FK2 - cascade. Se actualiza en sub_prod y problema todos los registros que hacen referencia a P1 reemplazandolo por P3.
80
81--c) DELETE FROM PRODUCTO;
82Las RIR que se activan son FK1 - cascade y FK2 - restrict. Se intentaría borrar todos los registros producto y de sub_prod (P1,1 ; P1,2 y P1,3) pero todos estan siendo referenciados desde problema.
83
84d) DELETE FROM DESARROLLADOR WHERE id_desar = 2;
85
86e) UPDATE DESARROLLADOR id_desar = 5 WHERE id_desar = 1;
87f) UPDATE PROBLEMA set id_equ_a_cargo = 'A', id_des_a_cargo = null where id_problema = 2
88
89
90
91
92-- EJERCICIO 2 Plantee en SQL estándar, mediante el recurso declarativo más adecuado (justificando la elección), la siguiente restriccion
93--Los desarrolladores sin salario deben tener indicada la dirección de mail
94ALTER TABLE desarrollador
95ADD CONSTRAINT CK_2_1 CHECK (e_mail IS NOT NULL OR salario IS NOT NULL);
96
97-- EJERCICIO 3 Plantee en SQL estándar, mediante el recurso declarativo más adecuado (justificando la elección),
98--la siguiente restriccion
99-- No puede haber problemas cuya fecha de cierre sea posterior a la fecha de cierre del producto al que están asociados
100CREATE ASSERTION CK_2_2
101CHECK NOT EXISTS
102(SELECT 1
103FROM problema prob JOIN producto prod ON(prob.id_producto = prod.id_producto)
104WHERE prob.fecha_cierre > prod.fecha_cierre);
105
106-- EJERCICIO 4 Plantee en SQL estándar, mediante el recurso declarativo más adecuado (justificando la elección), la siguiente restriccion
107-- El total de horas que pFueden dedicarse a resolver problemas de un mismo subproducto tiene un tope de 500.
108CREATE ASSERTION CK_4
109CHECK NOT EXISTS
110(SELECT 1
111FROM problema p
112GROUP BY id_problema, id_sub_prod
113HAVING SUM(cantidad_horas) > 500)
114
115-- EJERCICIO 5 Especifique el/los trigger/s (con su/s función/es) necesarios para implementar en Postgresql la restricción:
116-- "No puede haber problemas cuya fecha de cierre sea posterior a la fecha de cierre del producto al que están asociados
117
118
119CREATE OR REPLACE FUNCTION FN_FECHA_CIERRE()
120RETURNS trigger AS $$
121DECLARE
122 cantidad integer;
123BEGIN
124 IF (TG_NAME = 'CK_2_2_PROBLEMA') THEN
125 SELECT COUNT(*) INTO CANTIDAD
126 FROM PROBLEMA P JOIN PRODUCTO O ON (P.id_producto = O.id_producto)
127 where P.fecha_cierre > O.fecha_cierre
128 AND id_problema = NEW.id_problema;
129 END IF;
130 IF (TG_NAME = 'CK_2_2_PRODUCTO') THEN
131 SELECT COUNT(*) INTO CANTIDAD
132 FROM PROBLEMA P JOIN PRODUCTO O ON (P.id_producto = O.id_producto)
133 where P.fecha_cierre > O.fecha_cierre
134 AND id_producto = NEW.id_producto;
135 END IF;
136 IF ( cantidad > 0 ) THEN
137 RAISE EXCEPTION 'fecha de cierre de problemas mayor que la de producto';
138 END IF;
139RETURN NEW;
140END $$
141LANGUAGE 'plpgsql';
142
143CREATE TRIGGER CK_2_2_PROBLEMA
144BEFORE INSERT OR UPDATE OF fecha_cierre ON PROBLEMA
145FOR EACH ROW EXECUTE PROCEDURE FN_FECHA_CIERRE();
146
147CREATE TRIGGER CK_2_2_PRODUCTO
148BEFORE UPDATE OF fecha_cierre ON PRODUCTO
149FOR EACH ROW EXECUTE PROCEDURE FN_FECHA_CIERRE();
150
151
152-- EJERCICIO 6 Escriba una consulta SELECT que permita resolver la siguiente consulta
153-- Obtener todos los datos de los desarrolladores que no han reportado ni que han estado a cargo de problemas
154
155SELECT *
156FROM desarrollador
157WHERE (id_equipo, id_desar) NOT IN
158 SELECT (id_equ_reporta, id_des_reporta) FROM problema AND
159 SELECT (id_equipo, id_desar) FROM desarrollador NOT IN
160 SELECT (id_equ_a_cargo, id_des_a_cargo) FROM problema;
161
162-- EJERCICIO 7 Escriba una consulta SELECT que permita resolver la siguiente consulta
163-- Listar los Desarrolladores ociosos en la última semana, es decir aquellos que no han sido asignados a ningún problema
164-- de ningún producto en la última semana.
165SELECT *
166FROM desarrollador
167WHERE (id_equipo, id_desar) NOT IN
168SELECT (id_equ_reporta, id_des_reporta) FROM problema p
169WHERE (p.fecha_reporte) < (current_date -7);
170
171-- EJERCICIO 8 Realice un procedimiento que al ejecutarse borre los datos de la tabla ReporteProblemas (si hubieran)
172--y la complete con los productos no cerrados conjuntamente con los problemas no resueltos (fechas de cierre nulas)
173create table ReporteProblemas (
174id_producto varchar(5),
175descripcion_producto varchar(80),
176id_problema int,
177descripcion_problema varchar(80),
178fecha_reporte timestamp );
179
180CREATE OR REPLACE FUNCTION completar_reporteproblema()
181RETURNS integer AS
182$BODY$
183DECLARE
184 mi_consulta RECORD;
185BEGIN
186 DELETE FROM REPORTEPROBLEMA;
187 FOR mi_consulta IN SELECT O.id_producto, O.descripcion AS descripcion_producto, P.id_problema, P.descripcion, fecha_reporte
188 FROM PROBLEMA P JOIN PRODUCTO O ON (P.id_producto = O.id_producto)
189 WHERE P.fecha_cierre is null
190 OR O.fecha_cierre IS NULL
191 LOOP
192 INSERT INTO REPORTEPROBLEMA VALUES (
193 mi_consulta.id_producto,
194 mi_consulta.descripcion_producto,
195 mi_consulta.id_problema,
196 mi_consulta.descripcion,
197 mi_consulta.fecha_reporte);
198
199
200 END LOOP;
201 RETURN 1;
202END;
203$BODY$
204LANGUAGE plpgsql;
205
206-- ejecutar la función
207select completar_reporteproblema();
208
209
210-- Dada la restriccion que indica que un distribuidor puede ser nacional o internacional pero no ambos
211
212create assertion ck_p6 check not exists(
213 select 1 from distribuidor d
214 where (tipo = 'I') and exists(
215 select 1 from nacional n where n.id_distribuidor = d.id_distribuidor) or
216 (tipo ='N') and exists(
217 select 1 from internacional inter where inter.id_distribuidor = d.id_distribuidor));
218
219--Consulta que devuelva los datos de los empleados que sean jefes de los departamentos de distribuidoras que haya entregado mas de dos
220--peliculas entre los años 2005 y 2010 inclusive
221
222select *
223from empleado emp
224where id_empleado in(select jefe_departamento
225 from departamento departamento
226 join distribuidor dist on(dist.id_distribuidor = depto.id_distribuidor)
227 where(extract(year from fecha_entrega) >= 2005)and
228 (extract(year from fecha_entrega) <= 2010)
229 group by entr.id_distribuidor
230 having count(entr.id_distribuidor) > 2
231 limit 100);
232
233
234--ORDEN
235from where order select
236
237--Lista el nombre y apellido de todos los voluntarios que realizaron tareas cuyo identificador comienzan con 'AD'
238
239SELECT nombre, apellido
240FROM voluntario v
241WHERE nro_voluntario IN
242(SELECT nro_voluntario
243FROM historico h JOIN tarea t ON ( h.id_tarea = t.id_tarea)
244WHERE t.id_tarea like 'AD%' );
245
246--
247
248SELECT nombre, apellido
249FROM voluntario v
250WHERE EXISTS
251(SELECT 1
252FROM historico h JOIN tarea t ON(h.id_tarea=t.id_tarea)
253WHERE t.id_tarea like 'AD%'
254
255AND v.nro_voluntario = h.nro_voluntario );
256
257--
258
259SELECT nombre, apellido
260FROM voluntario v
261WHERE nro_voluntario IN
262
263(SELECT nro_voluntario
264FROM historico h JOIN tarea t ON ( h.id_tarea = t.id_tarea)
265WHERE t.id_tarea like 'AD%'
266
267AND v.nro_voluntario = h.nro_voluntario );
268
269--
270
271--Reparaciones_2015_M, usando la vista anterior, que contenga todos los datos de las Reparaciones del año 2015 de categoría M
272
273CREATE VIEW informes_2015_balizas AS
274
275SELECT *
276
277FROM informe infor
278
279WHERE (infor.tipo_elemento = 'B') and (extract(year from fecha_informe) = 2015))
280
281WITH CHECK OPTION;
282
283--- Reparaciones_2015, que contenga todos los datos de las Reparaciones del año 2015
284
285CREATE VIEW informes_2015 AS
286
287SELECT *
288
289FROM informe i
290
291WHERE extract(year from fecha_informe) = 2015);
292
293----------------------------------------------------------------------------------------
294-----------------------------------------------------------------------------------------
295-------------------------------------------------------------------------------------
296PRACTICO 3
297------------------
298----
299--
300
301(1)
302--Seleccione el identificador de distribuidor, identificador de departamento y nombre de todos
303--los departamentos.
304select id_distribuidor, id_departamento, nombre_departamento
305 from departamento
306
307(2)
308--1.2. Muestre los apellidos, nombres y mails de los empleados con cuentas de gmail y cuyo sueldo
309--sea superior a $ 1000.
310 select nombre, apellido, e_mail, sueldo
311 from empleado
312 where e_mail like '%gmail%' and sueldo >1000
313
314(4)
315--Muestre el nombre, apellido y el teléfono de todos los empleados cuyo id_tarea sea 7231,
316--ordenados por apellido y nombre.
317select nombre, apellido, telefono
318 from empleado
319 where id_tarea='7231'
320 order by apellido
321
322(5)
323--1.5. Hacer un listado de los cumpleaños de todos los empleados donde se muestre el nombre y el
324--apellido (concatenados y separados por una coma) y su fecha de cumpleaños (solo el día y el mes),
325--ordenado de acuerdo al mes y día de cumpleaños en forma ascendente.
326 SELECT apellido || ', ' || nombre AS "Apellido y nombre", extract(day from fecha_nacimiento) || '/' || extract(month from fecha_nacimiento) AS "Cumpleaños"
327 FROM empleado
328 order by extract(month from fecha_nacimiento), extract(day from fecha_nacimiento)
329
330(6)
331--Muestre el apellido, nombre y mail de todos los empleados cuyo teléfono comienza con 600.
332--Coloque el encabezado de las columnas de los títulos 'Apellido y Nombre' y 'Dirección de mail'.
333 SELECT apellido || ', ' || nombre AS "Apellido y nombre", e_mail "Dirección de email"
334 FROM empleado
335 WHERE telefono SIMILAR TO '666%'
336
337(7)
338--Muestre apellido e identificador de todos los empleados que no cobran porcentaje de
339--comisión.
340SELECT apellido, id_empleado
341 FROM empleado
342 WHERE porc_comision IS NULL
343
344(8)
345--Muestre los datos de los distribuidores internacionales que no tienen registrado teléfono.
346SELECT nombre, direccion, tipo, id_distribuidor, telefono
347 FROM distribuidor d
348 WHERE (d.telefono IS NULL) and d.id_distribuidor IN (SELECT i.id_distribuidor FROM internacional i)
349
350(8) --Mismo que el anterior pero con natural join
351
352SELECT nombre, direccion, tipo, id_distribuidor
353 FROM distribuidor d
354 natural join internacional i
355 WHERE (d.telefono IS NULL)
356
357(9)
358--Listar la cantidad de películas que hay por cada idioma.
359SELECT idioma, count(*)
360 FROM pelicula
361 GROUP BY idioma
362
363
364
365 ------------------------------------------------------------------------------------------------
366 Recuperatorio (VISTAS- EJERCICIOS HECHOS BIEN)
367
368 --Plantee en SQL estándar, mediante el recurso declarativo más adecuado (justificando la elección),
369 --las siguientes restricciones. JUSTIFIQUE SU ELECCIÓN
370
371-- Las categorías de equipos, al igual que la de los operarios indican el riesgo en la reparación y se
372--identifican con una letra A(alto), N(normal), M(medio), B(bajo)
373
374
375ALTER TABLE elemento
376ADD CONSTRAINT CK_1 CHECK (tipo_elemento = 'B' or tipo_elemento = 'C' or tipo_elemento= 'V');
377
378 --Indique el efecto de la siguiente operación sobre las tablas de la BD, explicando en caso de proceder, la diferencia según se haya considerado WITH CHECK OPTION LOCAL o CASCADE en la definición de la vista correspondiente
379
380-- - INSERT INTO Informes_2015_M VALUES (6, to_date('dd-mm-yyyy', '12-11-2015'), 'Otro', 2, 2, 'B');
381Respuesta: Con ningun WCO se podrá ejecutar ese insert porque intenta agregar una fecha anterior a la vista(es decir anterior al 2015),
382 por lo tanto lo deniega.
383
384 --Cree las siguiente vista indicando si resulta actualizable o no según el standard SQL (justifique):
385
386--- Reparaciones_2015, que contenga todos los datos de las Reparaciones del año 2015
387
388CREATE VIEW informes_2015 AS
389
390SELECT *
391
392FROM informe i
393
394WHERE extract(year from fecha_informe) = 2015);
395
396*La vista es actualizable ya que conserva todas las columnas de la clave primaria
397
398--Cree las siguiente vista indicando si resulta actualizable o no según el standard SQL (justifique):
399
400--- Reparaciones_2015_M, usando la vista anterior, que contenga todos los datos de las Reparaciones del año 2015
401--de categoría M
402
403CREATE VIEW informes_2015_balizas AS
404
405SELECT *
406
407FROM informe infor
408
409WHERE (infor.tipo_elemento = 'B') and (extract(year from fecha_informe) = 2015))
410
411WITH CHECK OPTION;
412
413
414
415*La vista es actualizable porque conserva la clave primaria, no hay ninguna agrupación, no hay subconsultas y no incluye la cláusula distinct.
416
417-------------------------------------------------------
418PREFINAL (revision EJERCICIOS HECHOS PERFECTOS)
419
420--Plantee en SQL estándar, mediante el recurso declarativo más adecuado (justificando la elección), las siguientes restricciones. JUSTIFIQUE SU ELECCIÓN.
421
422--- Los operarios sólo pueden reparar equipos de su categoría.
423
424CREATE ASSERTION CK_9
425CHECK (NOT EXISTS
426(SELECT 1
427FROM operario o JOIN reparacion r ON(o.id_operario = r.id_operario)
428WHERE (o.categoria_operario <> r.categoria_equipo)));
429
430-RI general de la base de datos.
431
432--Cree las siguiente vista indicando si resulta actualizable o no según el standard SQL (justifique):
433
434-- Reparaciones_2015, que contenga todos los datos de las Reparaciones del año 2015
435
436CREATE VIEW Reparaciones_2015 AS
437
438SELECT *
439
440FROM reparacion
441
442WHERE ((extract(year from fecha_reparacion) = 2015))
443
444WITH CHECK OPTION;
445
446- La vista es actualizable debido a:
447
448Conserva todas las columnas de la clave (primaria o alternativa)
449
450No contiene funciones de agregación o información derivada
451
452No incluye la claúsula DISTINCT
453
454No incluye subconsultas en el SELECT
455
456--Cree las siguiente vista indicando si resulta actualizable o no según el standard SQL (justifique):
457
458-- Reparaciones_2015_M, usando la vista anterior, que contenga todos los datos de las Reparaciones del año 2015 de categoría M
459
460CREATE VIEW Reparaciones_2015_M AS
461
462SELECT *
463
464FROM reparacion
465
466WHERE (categoria_equipo = 'M')
467
468WITH CHECK OPTION;
469
470-No pongo "((extract(year from fecha_reparacion) = 2015))" porque estoy usando la vista anterior y no es necesario.
471
472- La vista es actualizable (ya que se usa una sola tabla) debido a:
473
474Conserva todas las columnas de la clave (primaria o alternativa)
475
476No contiene funciones de agregación o información derivada
477
478No incluye la claúsula DISTINCT
479
480No incluye subconsultas en el SELECT
481
482--Indique el efecto de la siguiente operación sobre las tablas de la BD, explicando en caso de proceder, la diferencia según se haya considerado WITH CHECK OPTION LOCAL o CASCADE en la definición de la vista correspondiente
483
484--- INSERT INTO Reparaciones_2015 VALUES (5, to_date('12-11-2015','dd-mm-yyyy'), 'Otro', 2, 2, 'B');
485
486En caso de ser with local check option no se podria realizar el insert.
487
488En caso de ser with check option tampoco se podría realizar.
489
490--Indique el efecto de la siguiente operación sobre las tablas de la BD, explicando en caso de proceder, la diferencia según se haya considerado WITH CHECK OPTION LOCAL o CASCADE en la definición de la vista correspondiente
491
492--- INSERT INTO Informes_2015_M VALUES (6, to_date('dd-mm-yyyy', '12-11-2015'), 'Otro', 2, 2, 'B');
493
494Con ningun WCO se podrá ejecutar ese insert porque intenta agregar una categoria de equipo inexistente(No es ni A, N, M o b), por lo tanto lo deniega(da error).
495
496--Indique el efecto de la siguiente operación sobre las tablas de la BD, explicando en caso de proceder, la diferencia según se haya considerado WITH CHECK OPTION LOCAL o CASCADE en la definición de la vista correspondiente:
497
498--- UPDATE Informes_2015_M set categoria_equipo = 'Z' WHERE categoria_equipo = 'B';
499
500En caso de ser with local check option se puede ejecutar el update.
501
502En caso de ser with check option también se puede ejecutar el update.
503
504--Implemente en Postgresql la restricción
505
506--" Un Operario sólo puede reparar un equipo de su categoría "
507
508CREATE ASSERTION CK_9
509CHECK (NOT EXISTS
510(SELECT 1
511FROM operario o JOIN reparacion r ON(o.id_operario = r.id_operario)
512WHERE (o.categoria_operario <> r.categoria_equipo)));
513
514-RI general de la base de datos.
515
516/*Considere que un usuario A es propietario del esquema de la BD y ejecuta los siguientes comandos SQL (NOTA: considere que los usuarios están creados):
517
518A:
519
520GRANT SELECT, INSERT ON EMPLEADO TO B WITH GRANT OPTION;
521
522GRANT SELECT ON EMPLEADO TO C;
523
524y que luego B ejecuta:
525
526B:
527
528GRANT SELECT ON EMPLEADO TO C, D;
529
530Indique cuál/es de los usuarios puede/n ejecutar exitosamente los siguientes comandos (sino explique por qué no es posible):
531
532INSERT INTO A. EMPLEADO VALUES (…) ;
533SELECT * FROM A. EMPLEADO;
534GRANT SELECT ON A. EMPLEADO TO E;
535Explique qué ocurriría si A ejecuta:
536
537REVOKE SELECT ON EMPLEADO FROM B CASCADE; ? Qué permisos conservaría cada usuario después?*/
538
5391)A y B puede ejecutar este comando.
5402) Todos los usuarios pueden realizarlo.
5413)Sólo los usuarios A y B pueden realizar dichos comandos. C y D no poseen los privilegios para hacerlo.
542
5434)
544 A: Posee todos.
545 B:Conserva el INSERT.
546 C:Conserva el SELECT.
547 D:No tiene nada.