UD2: ADMINISTRACIÓ DE LA BASE DE DADES
Tema 2.1: Administració remota amb l'Schema Manager
Activitat 2.1.2: Disparadors de bases de dades (Triggers)
És un llenguatge propi d'Oracle, basat en ADA, que amplia les funcions d'SQL, afegint:
L'estructura d'un programa PL/SQL és:
Exemple:
El seguent codi modifica la taula EMP de SCOTT: actualitza el número de departament de l'empleat STEVE. Si aquest empleat no existeix, aleshores l'insereix a la taula:
DECLARE
BEGIN /* codi SQL d'actualització */
END; |
Proveu-lo des de la finestra SQL Worksheet de l'OEM i comproveu que s'afegeix l'empleat STEVE.
Objectes de codi PL/SQL enmagatzemats: funcions, procediments, paquets i
disparadors
Exemple de definició de funció d'ús general
en l'esquema jcuesta
Exercici: Creeu un objecte nou en Schema =>Functions i copieu el codi de la imatge per crear la funcó TIME. Un cop creada, aneu al SQL Worksheet i executeu les següents sentències: 1r) set serveroutput on 2n) executeu el codi PL/SQL següent: BEGIN Observeu que es mostra la hora del servidor Oracle. |
Sobre els drets dels objectes PL/SQL
L'únic dret d'accés que té sentit atorgar a la resta d'usuaris en el cas dels objectes PL/SQL es el dret d'execució. Per exemple:
grant execute on jcuesta.time to scott
donarà dret d'execució sobre la funció anterior a l'usuari scott.
Procediments
Són blocs de codi que normalment accpeten paràmetres i executen alguna acció. Per exemple el procediment SUBPTXT situat en SYS accepta 4 paràmetres i crida a un altre procediment anomenat SUBPTXT2:
Disparadors
Exemple de creació d'un disparador amb l'Enterprise Manager
Anem a crear un disparador sobre la taula Publicacions que s'activarà al modificar qualsevol de les dades d'un fila. Seguiu les següents passes:
1. Entreu en l'OEM identificant vos amb l'usuari que veu emprar al crear la
taula Publicacions
2. Botò dret sobre l'icona del vostre esquema; apareix la llista d'objectes
Oracle:
Triem "disparador".
3. En la carpeta General donem un nom al disparador i escribim el codi PL/SQL
que s'executarà:
4. En la targeta "Evento" decidim quan s'activarà el codi i en resposta a quin esdeveniment:
En l'exemple quan actualitzem les columnes "Marca" o "Model" de la taula ""Motos" de l'usuari JCUESTA s'executarà el codi PL/SQL. Fixeu-vos que està marcada la casella "Antes": abans de efectuar la transacció es dispararà el codi; d'aquesta forma podem executar accions complexes abans de modificar les dades, com ara verificacions o actualitzacions de dades relacionades. També podem triar que s'executi després de la transacció.
5. En la targeta "Avanzado" podem especificar que el disparador s'activi per a cada fila modificada en la taula. Per exemple si fem
UPDATE MOTOS SET MODEL =' ' WHERE MARCA='Honda';
modifiquem amb una única instrucció moltes files; per defecte el disparador només s'activa un sol cop, excepte si hem activat el disparador per files, llavors s'activarà per a cada fila modificada.
6. Acceptar el disparador. Comproveu que s'ha incorporat a la llista de disparadors de la taula, com mostra la figura:
6. Per provar el disparador, anem a PL/SQL. Modifiquem les dades de la fila
actual (estem suposant que hi han dades):
update publicacions set any_publicacio = '01/01/2000';
Observeu que es mostra la data del sistema (variable d'entorn SYSDATE)
abans (before) del missatge "1 fila actualitzada".
Un altre exemple més complex de disparador:
DECLARE cursor erronis is
|
En la secció de declaracions tenim dues variables: el contador conta i la variable erronis que es de tipus cursor. Un cursor representa un conjunt de registres (el resultat de la sentència SELECT).
En la secció executable recorrem el conjunt de registres erronis i verifiquem si algún d'ells té el contador > 2 (és a dir, si hi han duplicats). Si és així, mostra els registres que estan duplicats.
En la targeta "Events" tenim:
Per tant, després d'inserir un registre en la taula "TAULA",
es dispara el trigger que detecta si hi han registres duplicats.