-- 1. Crea l'espai de taules `SIMULACRE_USERS`CREATETABLESPACESIMULACRE_USERSDATAFILE'/opt/oracle/oradata/XE/XEPDB1/encrypted_users01.dbf'SIZE1MAUTOEXTENDONNEXT10MMAXSIZEUNLIMITED;-- 2. Crea l'usuari `simulacre2` amb la contrasenya `simulacre2`CREATEUSERsimulacre2IDENTIFIEDBYsimulacre2DEFAULTTABLESPACESIMULACRE_USERSQUOTAUNLIMITEDONSIMULACRE_USERS;-- 3. Crea la taula `productes` i `compres`CREATETABLEsimulacre2.productes(idNUMBERPRIMARYKEY,nomVARCHAR2(100),preuNUMBER);CREATETABLEsimulacre2.compres(idNUMBERPRIMARYKEY,producte_idNUMBER,quantitatNUMBER,data_compraDATE,FOREIGNKEY(producte_id)REFERENCESsimulacre2.productes(id));
Comprova el diccionari de dades per assegurar-te que les polítiques s'han aplicat correctament.
Mostra els registres d'auditoria relacionats amb les polítiques creades després d'haver realitzat algunes accions que les desencadenen.
Audita totes les operacions d'inserció, actualització i eliminació en la taula productes
que no s'hagen realitzat correctament.
Solució
Des de sys@XEPDB1:
-- Creem la políticaCREATEAUDITPOLICYpol_productes_errorsACTIONSINSERTONsimulacre2.productes,UPDATEONsimulacre2.productes,DELETEONsimulacre2.productes;-- Activem la políticaAUDITPOLICYpol_productes_errorsWHENEVERNOTSUCCESSFUL;-- Comprovem que la política està activaSELECT*FROMaudit_unified_policiesWHEREpolicy_nameLIKE'POL_PRODUCTES%';
Des de simulacre2@XEPDB1:
-- Insertem dues vegades un producte amb el mateix ID per provocar un errorINSERTINTOsimulacre2.productes(id,nom,preu)VALUES(1,'Producte 1',10.50);INSERTINTOsimulacre2.productes(id,nom,preu)VALUES(1,'Producte 1',10.50);
Des de sys@XEPDB1:
-- Comprovem els registres d'auditoriaSELECTDBUSERNAME,ACTION_NAME,RETURN_CODE,OBJECT_SCHEMA,OBJECT_NAME,SQL_TEXTFROMUNIFIED_AUDIT_TRAILWHEREOBJECT_SCHEMA='SIMULACRE2';
Audita totes les operacions de eliminació correctes en la taula
productes on el preu del producte siga superior a 100.
Solució
Des de sys@XEPDB1:
-- Creem la políticaBEGINDBMS_FGA.ADD_POLICY(object_schema=>'SIMULACRE2',object_name=>'PRODUCTES',policy_name=>'AUDIT_PRODUCTES_CARS',audit_condition=>'PREU > 100',statement_types=>'DELETE');END;/-- Comprovem que la política està activaSELECT*FROMDBA_AUDIT_POLICIES;
Des de simulacre2@XEPDB1:
INSERTINTOsimulacre2.productes(id,nom,preu)VALUES(2,'Producte 2',10.50);INSERTINTOsimulacre2.productes(id,nom,preu)VALUES(3,'Producte 3',100.50);-- Eliminem els productesDELETEFROMsimulacre2.productesWHEREpreu<50;-- No s'auditaràDELETEFROMsimulacre2.productesWHEREpreu>50;-- S'auditarà
Des de simulacre2@XEPDB1:
-- Comprovem els registres d'auditoriaSELECTDB_USER,OS_USER,USERHOST,TIMESTAMP,OBJECT_SCHEMA,OBJECT_NAME,SQL_TEXTFROMDBA_FGA_AUDIT_TRAILWHEREobject_name='PRODUCTES'ORDERBYtimestampDESC;
Crea un disparador sobre la taula compres que limite el número de productes
comprats d'un mateix tipus a un màxim de 10.
El disparador també ha de tindre en compte els productes que ja s'han comprat anteriorment, no només els que s'estan intentant comprar en la transacció actual.
En cas d'error, ha de mostrar un missatge informatiu amb informació significativa.
Solució
CREATEORREPLACETRIGGERsimulacre2.trg_limit_compresBEFOREINSERTORUPDATEONsimulacre2.compresFOREACHROWDECLAREv_total_actualNUMBER;BEGIN-- Sumem la quantitat ja comprada d'eixe producteSELECTCOALESCE(SUM(quantitat),0)INTOv_total_actualFROMsimulacre2.compresWHEREproducte_id=:NEW.producte_id;-- Comprovem si el total (existent + nou) supera 10IF(v_total_actual+:NEW.quantitat)>10THENRAISE_APPLICATION_ERROR(-20001,'Error: El producte '||:NEW.producte_id||' ja té '||v_total_actual||' unitats. '||'No pots afegir '||:NEW.quantitat||' perquè superaria el límit de 10.');ENDIF;END;/INSERTINTOcompresVALUES(1,1,8,SYSDATE);-- OKINSERTINTOcompresVALUES(2,1,3,SYSDATE);-- ERROR
📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent
a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.