UD05 · Definició i control de dades (DDL i DCL)
Resum del tema
Fins ara hem dissenyat. En esta unitat implementem: convertim l’esquema relacional en taules reals dins d’un SGBD. Per a això usem dos subllenguatges de SQL:
- DDL (Data Definition Language): crea, modifica i elimina l’estructura (taules, restriccions, índexs, vistes, seqüències).
- DCL (Data Control Language): controla qui pot fer què (usuaris, rols i privilegis).
Tots els exemples usen Oracle AI Database 26ai Free. Quan una característica siga pròpia d’Oracle o d’una versió concreta, s’indica.
RA2 Crea bases de dades definint-ne l'estructura i les característiques dels elements segons el model relacional. 8 CE
- RA2.a S'ha analitzat el format d'emmagatzematge de la informació.
- RA2.b S'han creat les taules i les relacions entre elles.
- RA2.c S'han seleccionat els tipus de dades adequats.
- RA2.d S'han definit els camps clau a les taules.
- RA2.e S'han implantat les restriccions reflectides en el disseny lògic.
- RA2.f S'han creat vistes.
- RA2.g S'han creat els usuaris i se'ls han assignat privilegis.
- RA2.h S'han utilitzat assistents, eines gràfiques i els llenguatges de definició i control de dades.
RA6 Dissenya models relacionals normalitzats interpretant diagrames entitat/relació. 2 CE
- RA6.a S'han utilitzat eines gràfiques per a representar el disseny lògic.
- RA6.f S'han aplicat regles d'integritat.
Temporalització
La unitat ocupa 17 hores d’aula (9 de teoria i 8 de pràctica).
| Sessió | Hores | Tipus | Contingut | On |
|---|---|---|---|---|
| 1 | 1 | Teoria | SQL i Oracle. Emmagatzematge de la informació | §1 i §2 |
| 2 | 2 | Teoria | Tipus de dades d’Oracle | §3 · calculadora de NUMBER(p, s) |
| 3 | 2 | Teoria | CREATE TABLE i restriccions d’integritat | §4 i §5 · constructor de CREATE TABLE |
| 4 | 2 | Pràctica | Primeres taules i restriccions en Oracle | Pràctica 5.1 |
| 5 | 2 | Pràctica | Del diagrama de Chen al DDL | Pràctica 5.2 |
| 6 | 1 | Teoria | Modificar i eliminar l’estructura (ALTER, DROP) | §6 |
| 7 | 1 | Pràctica | Evolució de l’esquema amb ALTER | Pràctica 5.5 |
| 8 | 1 | Teoria | Seqüències, identitat, índexs i vistes | §7, §8 i §9 |
| 9 | 1 | Pràctica | Índexs, vistes i seqüències en EduGest | Pràctica 5.6 |
| 10 | 2 | Teoria | Usuaris, rols i privilegis. Diccionari de dades i eines | §10 a §12 · taller de privilegis |
| 11 | 1 | Pràctica | Usuaris, rols i privilegis en EduGest | Pràctica 5.7 |
| 12 | 1 | Pràctica | Implementació d’EduGest | Projecte EduGest-5 |
En esta unitat passes del paper al SGBD. Executa cada sentència mentres llegixes: un
CREATE TABLEque no has provat és només una hipòtesi. Els ginys interactius simulen el comportament d’Oracle amb finalitats didàctiques, però no substituïxen un SGBD real.
Objectius d’aprenentatge
En acabar esta unitat seràs capaç de:
- Explicar com emmagatzema Oracle la informació (blocs, segments, tablespaces).
- Triar el tipus de dades adequat per a cada columna.
- Crear taules amb totes les restriccions del disseny lògic: claus primàries, alienes i alternatives,
NOT NULLiCHECK. - Modificar i eliminar objectes de manera segura.
- Crear seqüències, columnes identitat, índexs i vistes.
- Crear usuaris i rols, i assignar privilegis aplicant el principi de mínim privilegi.
- Consultar el diccionari de dades per a comprovar allò que has creat.
- Usar assistents i eines gràfiques sense dependre’n.
Curiositat D'on ve el nom «Oracle»?
Abans de ser una empresa de bases de dades, Larry Ellison, Bob Miner i Ed Oates van treballar en un projecte per a la CIA amb el nom en clau Oracle. Quan van fundar la seua pròpia companyia el 1977 (aleshores Software Development Laboratories) van reutilitzar el nom per al producte.
1. SQL i Oracle
1.1 Subllenguatges de SQL
| Subllenguatge | Sentències | Per a què | Unitat |
|---|---|---|---|
| DDL | CREATE, ALTER, DROP, TRUNCATE, RENAME, COMMENT | Definir l’estructura | UD05 |
| DCL | GRANT, REVOKE | Controlar l’accés | UD05 |
| DML | SELECT, INSERT, UPDATE, DELETE, MERGE | Consultar i modificar dades | UD06 a UD08 |
| TCL | COMMIT, ROLLBACK, SAVEPOINT | Controlar transaccions | UD08 |
En Oracle, cada sentència DDL executa un
COMMITimplícit abans i després d’executar-se. Si tenies canvis de dades pendents i llances unCREATE TABLE, eixos canvis queden confirmats i ja no podràs desfer-los ambROLLBACK.
1.2 SQL estàndard enfront de dialectes
SQL és un estàndard ISO/IEC 9075, però cada SGBD n’implementa una part i afig extensions. Per això un script de MySQL no sol funcionar en Oracle sense canvis:
1.3 Regles d’escriptura en Oracle
- Les paraules reservades i els identificadors no distingeixen majúscules:
CREATE TABLE Alumnocrea la taulaALUMNO. Oracle guarda els noms en majúscules en el diccionari. - Si escrius un identificador entre cometes dobles (
"Alumno"), Oracle respecta majúscules i espais, i hauràs d’usar sempre les cometes. Evita-ho. - Els identificadors poden tindre fins a 128 bytes (des d’Oracle 12.2), comencen per lletra i poden contindre lletres, números,
_,$i#. - Cada sentència acaba en
;. Els blocs PL/SQL (UD09) acaben a més amb/en una línia. - Comentaris:
-- hasta el final de la líneai/* de varias líneas */. - Les cadenes van entre cometes simples:
'DAM'. Per a incloure una cometa, es duplica:'Sant Joan d''Alacant'.
1.4 Usuari i esquema
En Oracle, un esquema és el conjunt d’objectes (taules, vistes, índexs…) que pertanyen a un usuari, i té el seu mateix nom. En connectar-te com a EDUGEST i crear la taula ALUMNO, el seu nom complet és EDUGEST.ALUMNO. Un altre usuari amb permís la consultaria així:
SELECT * FROM edugest.alumno;2. Format d’emmagatzematge de la informació
El criteri RA2.a demana analitzar com es guarda la informació. Oracle organitza l’emmagatzematge en dos nivells:
flowchart LR
subgraph Lògic
TS[Tablespace USERS] --> SEG[Segment<br/>taula ALUMNO]
SEG --> EXT[Extensions]
EXT --> BLK[Blocs de dades<br/>8 KB]
end
subgraph Físic
DF[(Fitxers de dades .dbf)] --> OSB[Blocs del<br/>sistema operatiu]
end
TS -.es guarda en.-> DF
BLK -.ocupen.-> OSB| Estructura | Què és |
|---|---|
| Bloc de dades | La unitat mínima de lectura i escriptura (normalment 8 KB). Conté diverses files |
| Extensió (extent) | Conjunt de blocs contigus que s’assigna d’una vegada |
| Segment | Tot l’espai d’un objecte: una taula, un índex… |
| Tablespace | Contenidor lògic de segments. USERS és el de les dades d’usuari; SYSTEM i SYSAUX, els del diccionari |
| Fitxer de dades | Fitxer físic del sistema operatiu on es guarda un tablespace |
Cada fila té una adreça física única, el ROWID, que indica el fitxer, el bloc i la posició dins del bloc. És la forma més ràpida de localitzar una fila i la que usen internament els índexs.
SELECT ROWID, nombre FROM alumno FETCH FIRST 3 ROWS ONLY;Una taula normal d’Oracle és una taula munt (heap): les files es guarden on hi ha espai lliure, sense cap ordre. Per això una consulta sense
ORDER BYpot tornar les files en qualsevol ordre, i eixe ordre pot canviar.
Curiositat En Oracle, la cadena buida és NULL
A diferència de l’estàndard SQL, Oracle tracta '' (cadena de longitud zero) com a NULL. Per això WHERE nombre = '' mai no torna files i cal escriure WHERE nombre IS NULL.
3. Tipus de dades
Triar bé el tipus de cada columna (RA2.c) evita errors, estalvia espai i permet que el SGBD valide les dades.
3.1 Tipus principals d’Oracle
| Categoria | Tipus | Descripció | Exemple d’ús |
|---|---|---|---|
| Text | VARCHAR2(n) | Text de longitud variable, fins a n bytes (màx. 4000; 32767 amb MAX_STRING_SIZE=EXTENDED) | nom, email |
CHAR(n) | Text de longitud fixa: s’omple amb espais | dni, codis de longitud fixa | |
NVARCHAR2(n) | Text Unicode en el joc de caràcters nacional | Rarament necessari amb AL32UTF8 | |
CLOB | Text molt llarg (gigabytes) | observacions, documents | |
| Numèric | NUMBER(p, s) | Nombre exacte amb p dígits en total i s decimals | imports, notes, quantitats |
NUMBER | Sense precisió: qualsevol nombre | evitar-lo en columnes de negoci | |
INTEGER | Sinònim de NUMBER(38) | comptadors | |
BINARY_DOUBLE | Coma flotant IEEE 754 | càlculs científics | |
| Data i hora | DATE | Data i hora (fins a segons) | data de naixement, de matrícula |
TIMESTAMP(n) | Data i hora amb fraccions de segon | registres d’auditoria | |
TIMESTAMP WITH TIME ZONE | Inclou la zona horària | aplicacions internacionals | |
INTERVAL DAY TO SECOND | Durada | temps d’una tasca | |
| Lògic | BOOLEAN | TRUE, FALSE o NULL (des de 23ai) | actiu, justificada |
| Binari | BLOB, RAW(n) | Dades binàries | fotografies, hashes |
| Altres | JSON | Document JSON natiu (des de 21c) | dades semiestructurades |
VECTOR | Vectors per a cerca per similitud (des de 23ai) | aplicacions d’IA |
3.2 Precisió i escala de NUMBER
NUMBER(p, s): p és el nombre total de dígits significatius i s quants d’ells van després de la coma.
| Declaració | Rang admés | Valor inserit | Valor guardat |
|---|---|---|---|
NUMBER(4,2) | -99,99 a 99,99 | 7.256 | 7,26 (arredoneix) |
NUMBER(4,2) | 123.5 | Error ORA-01438 | |
NUMBER(5) | -99999 a 99999 | 12.7 | 13 |
NUMBER(8,2) | fins a 999 999,99 | 1520.5 | 1520,50 |
3.3 Criteris per a triar el tipus
- S’hi opera? Si se suma o es compara numèricament, és
NUMBER. Si no (DNI, telèfon, codi postal), és text:'03690'perdria el zero inicial com a número. - Té longitud fixa?
CHARnomés si sempre ocupa el mateix (DNI:CHAR(9)). En la resta,VARCHAR2. - Necessita decimals exactes? Els diners es guarden sempre en
NUMBER(p, s), mai en coma flotant. - És una data? Usa
DATEoTIMESTAMP, mai text: així pots ordenar, comparar i calcular. - Dimensiona amb marge raonable, sense exagerar:
VARCHAR2(4000)per a un nom dificulta la validació i la lectura del disseny.
3.4 Equivalències amb altres SGBD
| Concepte | Oracle | MySQL / MariaDB | PostgreSQL | SQL Server |
|---|---|---|---|---|
| Text variable | VARCHAR2(n) | VARCHAR(n) | VARCHAR(n) | VARCHAR(n) |
| Enter | NUMBER(10) | INT | INTEGER | INT |
| Decimal exacte | NUMBER(p,s) | DECIMAL(p,s) | NUMERIC(p,s) | DECIMAL(p,s) |
| Data sense hora | DATE (inclou hora) | DATE | DATE | DATE |
| Autoincrement | IDENTITY o seqüència | AUTO_INCREMENT | IDENTITY o SERIAL | IDENTITY |
| Lògic | BOOLEAN (23ai) | BOOLEAN (= TINYINT(1)) | BOOLEAN | BIT |
En Oracle la cadena buida
''ésNULL.INSERT INTO alumno (..., email) VALUES (..., '')guarda unNULL, i la condicióemail = ''mai no és vertadera. En MySQL i PostgreSQL la cadena buida iNULLsón coses distintes. És una de les diferències que més errors provoca en migrar.
El tipus
DATEd’Oracle sempre guarda l’hora.SYSDATEtorna data i hora actuals. Si comparesfecha_matricula = DATE '2025-09-15'i la fila es va inserir ambSYSDATE, no coincidirà perquè l’hora no és 00:00:00. Ho tractarem a la UD06.
Calculadora de NUMBER(p, s)
Prova quins valors admet una columna i com els arredoneix Oracle. Observa què passa quan l’escala és negativa o quan el valor excedeix la precisió.
4. Creació de taules: CREATE TABLE
4.1 Finalitat i sintaxi
CREATE TABLE crea una taula buida amb les seues columnes i restriccions.
CREATE TABLE [esquema.]nom_taula (
columna tipus [DEFAULT valor] [restriccions_de_columna],
columna tipus ...,
[restriccions_de_taula]
);4.2 Exemple senzill, element a element
Oracle 26aiCREATE TABLE ciclo (
cod_ciclo VARCHAR2(5) CONSTRAINT pk_ciclo PRIMARY KEY,
nombre VARCHAR2(100) NOT NULL,
grado VARCHAR2(8) DEFAULT 'SUPERIOR' NOT NULL,
horas_totales NUMBER(4)
);| Element | Significat |
|---|---|
CREATE TABLE ciclo | Crea una taula anomenada CICLO en l’esquema de l’usuari connectat |
cod_ciclo VARCHAR2(5) | Columna de text variable de fins a 5 bytes |
CONSTRAINT pk_ciclo PRIMARY KEY | Restricció amb nom PK_CICLO: cod_ciclo és la clau primària (única i no nul·la) |
NOT NULL | La columna és obligatòria |
DEFAULT 'SUPERIOR' | Valor que s’usa si en l’INSERT no s’indica esta columna |
NUMBER(4) | Nombre enter de fins a 4 dígits. Sense NOT NULL, admet nuls |
Comprova el resultat amb l’ordre DESC del client:
SQL> DESC ciclo
Name Null? Type
-------------- -------- -------------
COD_CICLO NOT NULL VARCHAR2(5)
NOMBRE NOT NULL VARCHAR2(100)
GRADO NOT NULL VARCHAR2(8)
HORAS_TOTALES NUMBER(4)4.3 Restriccions de columna i de taula
Una restricció pot escriure’s junt a la columna o al final, com un element més de la taula. Les restriccions que afecten diverses columnes (una clau primària composta, un UNIQUE de dues columnes o un CHECK que compara dues columnes) només poden escriure’s al final.
CREATE TABLE imparte (
id_modulo NUMBER(5),
cod_grupo VARCHAR2(10),
curso_academico CHAR(7),
id_profesor NUMBER(5) NOT NULL,
horas_semanales NUMBER(2) NOT NULL,
-- restriccions de taula
CONSTRAINT pk_imparte PRIMARY KEY (id_modulo, cod_grupo, curso_academico),
CONSTRAINT ck_imparte_horas CHECK (horas_semanales BETWEEN 1 AND 12)
);4.4 Valors per defecte i columnes especials
| Clàusula | Efecte | Exemple |
|---|---|---|
DEFAULT expr | S’usa si la columna no apareix en l’INSERT | fecha_alta DATE DEFAULT SYSDATE |
DEFAULT ON NULL expr | S’usa també si s’inserix explícitament NULL | convocatoria NUMBER(1) DEFAULT ON NULL 1 |
GENERATED ALWAYS AS IDENTITY | Oracle genera el valor; no se’n pot inserir un de propi | id NUMBER GENERATED ALWAYS AS IDENTITY |
GENERATED BY DEFAULT ON NULL AS IDENTITY | Oracle genera el valor si no s’indica o si és NULL | Usat en ALUMNO d’EduGest |
GENERATED ALWAYS AS (expr) VIRTUAL | Columna virtual: es calcula, no s’emmagatzema | total NUMBER GENERATED ALWAYS AS (cantidad * precio) VIRTUAL |
5. Restriccions d’integritat
Les restriccions implanten en la base de dades les regles del disseny lògic (RA2.d, RA2.e, RA6.f). El SGBD rebutja qualsevol operació que les incomplisca, vinga de l’aplicació que vinga.
5.1 Resum de restriccions
| Restricció | Garantix | Prefix del nom | Error si s’incompleix |
|---|---|---|---|
NOT NULL | La columna té valor | nn_ | ORA-01400 cannot insert NULL |
PRIMARY KEY | Identificació única i no nul·la de cada fila | pk_ | ORA-00001 unique constraint violated |
UNIQUE | No hi ha valors repetits (admet diversos NULL) | uq_ | ORA-00001 |
FOREIGN KEY | El valor existix en la taula referenciada | fk_ | ORA-02291 parent key not found / ORA-02292 child record found |
CHECK | Es complix una condició sobre la fila | ck_ | ORA-02290 check constraint violated |
Posa sempre nom a les restriccions. Si no ho fas, Oracle s’inventa un com
SYS_C008123. Quan un usuari reba l’errorORA-02290: check constraint (EDUGEST.CK_MATRICULA_NOTA) violated, sabrà exactament quina regla ha incomplit.
5.2 Clau primària i claus alternatives
CREATE TABLE profesor (
id_profesor NUMBER(5) CONSTRAINT pk_profesor PRIMARY KEY,
dni CHAR(9) CONSTRAINT nn_profesor_dni NOT NULL,
email VARCHAR2(100) NOT NULL,
...
CONSTRAINT uq_profesor_dni UNIQUE (dni),
CONSTRAINT uq_profesor_email UNIQUE (email)
);Una clau candidata no triada com a primària s’implanta com a UNIQUE + NOT NULL. Oracle crea automàticament un índex per a cada PRIMARY KEY i cada UNIQUE.
5.3 Claus alienes
CONSTRAINT fk_matricula_alumno FOREIGN KEY (id_alumno)
REFERENCES alumno (id_alumno)
ON DELETE CASCADE| Component | Significat |
|---|---|
FOREIGN KEY (id_alumno) | Columna (o columnes) d’esta taula |
REFERENCES alumno (id_alumno) | Taula i columna referenciades: han de ser la seua PRIMARY KEY o un UNIQUE |
ON DELETE CASCADE | En esborrar l’alumne, s’esborren les seues matrícules |
ON DELETE SET NULL | En esborrar la fila pare, la columna es posa a NULL |
| (res) | Es rebutja l’esborrat del pare si té fills |
- La taula referenciada ha d’existir abans. Crea primer les taules «pare» o afig la clau aliena després amb
ALTER TABLE(és el que fa EduGest amb el cap de departament, perquèDEPARTAMENTOiPROFESORes referencien mútuament).- Una clau aliena admet
NULLllevat que afigquesNOT NULL. Una fila amb la clau aliena aNULLno es comprova.- Oracle no crea índexs sobre les claus alienes. Crea’ls tu (apartat 8).
5.4 Restriccions CHECK
Un CHECK és una condició que ha de ser vertadera o desconeguda (NULL) per a cada fila:
CONSTRAINT ck_matricula_nota CHECK (nota_final BETWEEN 0 AND 10),
CONSTRAINT ck_grupo_turno CHECK (turno IN ('M', 'T')),
CONSTRAINT ck_falta_horas CHECK (horas BETWEEN 1 AND 6),
CONSTRAINT ck_matricula_curso CHECK (REGEXP_LIKE(curso_academico, '^[0-9]{4}-[0-9]{2}$')),
CONSTRAINT ck_reserva_fechas CHECK (fecha_salida > fecha_entrada)Si
nota_finalésNULL, la condiciónota_final BETWEEN 0 AND 10és desconeguda i elCHECKl’accepta. Si la columna ha de tindre valor, afigNOT NULL.Un
CHECKno pot usar subconsultes, ni consultar altres taules, ni cridarSYSDATE. Les regles que ho necessiten són restriccions no representables (UD03, apartat 6) i s’implementen amb triggers (UD09).
5.5 Consultar les restriccions en el diccionari
SELECT constraint_name, constraint_type, search_condition, r_constraint_name, delete_rule
FROM user_constraints
WHERE table_name = 'MATRICULA'
ORDER BY constraint_type;
SELECT constraint_name, column_name, position
FROM user_cons_columns
WHERE table_name = 'MATRICULA'
ORDER BY constraint_name, position;constraint_type: P = clau primària, U = única, R = referencial (clau aliena), C = CHECK (també NOT NULL).
Constructor de CREATE TABLE
Defineix columnes, tipus i restriccions i observa l’script que genera. Les restriccions porten sempre nom (pk_, fk_, uq_, ck_, nn_), la qual cosa facilita interpretar els errors d’Oracle.
PK: marca varias columnas para una clave primaria compuesta. FK: escribe tabla(columna). CHECK: la condición sin la palabra CHECK.
Canvia a l’exemple MATRICULA i localitza la clau primària composta i les dues claus alienes. Després elimina una d’elles i raona quina integritat perds.
De les regles de transformació de la UD03 al DDL
A la UD03 vas dissenyar l’esquema relacional sense escriure SQL. Esta taula tradueix cada decisió de disseny a la seua sentència en Oracle:
| Decisió de disseny (UD03) | S’implanta en Oracle com a |
|---|---|
| Clau primària (PK) | PRIMARY KEY; si és composta, restricció de taula PRIMARY KEY (col1, col2) |
| Clau alternativa (UK) | UNIQUE, i NOT NULL si l’atribut és obligatori |
| Atribut obligatori | NOT NULL |
| Regla de fila | CHECK (condició sobre la mateixa fila) |
| Clau aliena obligatòria (participació mínima 1) | FOREIGN KEY + columna NOT NULL |
| Relació 1:1 amb clau aliena | FOREIGN KEY + UNIQUE sobre la clau aliena |
| Esborrat en cascada | ON DELETE CASCADE |
| Posada a nuls | ON DELETE SET NULL (la columna ha d’admetre NULL) |
| Esborrat restringit | no s’escriu res: és el comportament per defecte d’Oracle |
| Canvi de clau en cascada | No existix ON UPDATE en Oracle: per això s’usen claus primàries estables |
Quan traduïsques un esquema de la UD03, seguix este ordre: primer les taules sense claus alienes, després les taules filles i, finalment, les claus alienes circulars amb
ALTER TABLE.
Curiositat DDL confirma sol
En Oracle, cada sentència DDL (CREATE, ALTER, DROP) fa un COMMIT implícit abans i després. No es pot desfer amb ROLLBACK: per això es prova primer en un esquema de proves.
6. Modificar i eliminar l’estructura
6.1 ALTER TABLE
Oracle 26ai-- Afegir columnes (en Oracle no s'escriu la paraula COLUMN)
ALTER TABLE alumno ADD (fecha_alta DATE DEFAULT SYSDATE);
-- Canviar el tipus, la grandària o l'obligatorietat
ALTER TABLE alumno MODIFY (telefono VARCHAR2(20));
ALTER TABLE alumno MODIFY (localidad NOT NULL); -- falla si hi ha files amb NULL
-- Renomenar i eliminar columnes
ALTER TABLE alumno RENAME COLUMN telefono TO telefono_movil;
ALTER TABLE alumno DROP COLUMN fecha_alta;
-- Afegir i eliminar restriccions
ALTER TABLE alumno ADD CONSTRAINT ck_alumno_email CHECK (email LIKE '%@%');
ALTER TABLE alumno DROP CONSTRAINT ck_alumno_email;
-- Desactivar temporalment una restricció (per exemple, en una càrrega massiva)
ALTER TABLE matricula DISABLE CONSTRAINT fk_matricula_modulo;
ALTER TABLE matricula ENABLE CONSTRAINT fk_matricula_modulo;
-- Renomenar una taula
RENAME alumno_tmp TO alumno_historico;Quan actives una restricció, Oracle comprova totes les files existents. Si alguna l’incompleix, l’
ENABLEfalla. AmbENABLE NOVALIDATEnomés es comproven les files noves, però aleshores la taula pot contindre dades incorrectes.
6.2 DROP TABLE, paperera i TRUNCATE
DROP TABLE matricula; -- va a la paperera de reciclatge
FLASHBACK TABLE matricula TO BEFORE DROP; -- la recupera
DROP TABLE matricula PURGE; -- esborrat definitiu
DROP TABLE alumno CASCADE CONSTRAINTS; -- esborra també les FK que apunten a ALUMNO
DROP TABLE IF EXISTS alumno_tmp; -- sense error si no existeix (23ai i posteriors)
TRUNCATE TABLE falta_asistencia; -- buida la taula; no es pot desfer| Sentència | Esborra | Estructura | Es pot desfer? |
|---|---|---|---|
DELETE FROM t (DML, UD08) | Files (totes o algunes) | Es manté | Sí, amb ROLLBACK |
TRUNCATE TABLE t | Totes les files | Es manté | No (és DDL) |
DROP TABLE t | Taula i dades | Desapareix | Només des de la paperera |
DROP TABLE t PURGE | Taula i dades | Desapareix | No |
TRUNCATEiDROP ... PURGEno es poden desfer. En un servidor de producció, abans d’executar-los: comprova a quina base de dades estàs connectat, fes una còpia de seguretat i, si és possible, que una altra persona revise l’ordre.
6.3 Documentar el disseny amb comentaris
COMMENT ON TABLE matricula IS 'Matrícula de un alumno en un módulo para un curso académico';
COMMENT ON COLUMN matricula.nota_final IS 'NULL = sin calificar';
SELECT column_name, comments FROM user_col_comments WHERE table_name = 'MATRICULA';7. Seqüències i columnes identitat
Per a generar identificadors artificials (claus subrogades) hi ha dos mecanismes:
Les seqüències no garantixen valors consecutius: un
ROLLBACK, la caché o un reinici poden deixar buits. Un identificador artificial només ha de ser únic, no correlatiu. Si el negoci exigix números de factura sense buits, cal implementar-ho d’una altra manera.
8. Índexs
Un índex és una estructura addicional, normalment un arbre B+, que permet localitzar files sense recórrer tota la taula, igual que l’índex alfabètic d’un llibre.
-- Índex simple sobre una clau aliena
CREATE INDEX ix_alumno_grupo ON alumno (cod_grupo);
-- Índex compost: útil per a cerques per cognoms i nom
CREATE INDEX ix_alumno_apellidos_nombre ON alumno (apellidos, nombre);
-- Índex únic (equival a la restricció UNIQUE, però és preferible la restricció)
CREATE UNIQUE INDEX ux_modulo_codigo_ciclo ON modulo (codigo, cod_ciclo);
-- Índex basat en funció: cerques sense distingir majúscules
CREATE INDEX ix_alumno_email_upper ON alumno (UPPER(email));
DROP INDEX ix_alumno_apellidos_nombre;| Convé indexar | No convé indexar |
|---|---|
Claus alienes (s’usen en els JOIN i en esborrar en la taula pare) | Taules molt xicotetes |
Columnes molt usades en WHERE amb valors molt selectius | Columnes amb pocs valors distints (turno: M/T) |
| Columnes usades per a ordenar resultats grans | Columnes que es modifiquen constantment |
Un índex accelera les lectures però alenteix les escriptures: cada
INSERT,UPDATEoDELETEha d’actualitzar també tots els índexs de la taula, i a més ocupa espai. Indexar és una decisió de disseny físic: la UD07 ensenya a comprovar amb el pla d’execució si un índex s’usa.
Laboratori: quant ajuda un índex?
Mou el lliscador per a veure quants blocs llig una cerca amb índex i sense.
Modelo simplificado: 100 filas por bloque, un B-tree con ~200 claves por nodo y acceso a una sola fila por clave única. La barra usa escala logarítmica.
9. Vistes
Una vista és una consulta guardada amb nom que s’usa com si fora una taula. No emmagatzema dades: cada vegada que es consulta, executa el seu SELECT (RA2.f).
9.1 Per a què servixen
- Seguretat: mostrar només algunes columnes o files a certs usuaris.
- Simplicitat: ocultar consultes complexes (diverses taules, càlculs).
- Independència lògica: si canvia l’estructura de les taules, s’adapta la vista i les aplicacions continuen funcionant.
9.2 Creació
-- El professorat necessita el llistat d'alumnes, però no el seu DNI ni el seu telèfon
CREATE OR REPLACE VIEW v_alumno_listado AS
SELECT id_alumno, nia, nombre, apellidos, email, cod_grupo
FROM alumno;
-- Vista de només lectura per a tutoria: alumnat d'un grup concret
CREATE OR REPLACE VIEW v_alumno_1dam AS
SELECT id_alumno, nombre, apellidos, email
FROM alumno
WHERE cod_grupo = '1DAM'
WITH READ ONLY;
-- Vista actualitzable que impedix «traure» files del seu àmbit
CREATE OR REPLACE VIEW v_matricula_abierta AS
SELECT id_matricula, id_alumno, id_modulo, curso_academico, nota_final
FROM matricula
WHERE curso_academico = '2026-27'
WITH CHECK OPTION CONSTRAINT ck_v_matricula_abierta;
SELECT * FROM v_alumno_listado WHERE cod_grupo = '2DAW';
DROP VIEW v_alumno_1dam;| Clàusula | Efecte |
|---|---|
OR REPLACE | Si la vista existix, la substituïx sense perdre els privilegis concedits |
WITH READ ONLY | No permet INSERT, UPDATE ni DELETE a través de la vista |
WITH CHECK OPTION | Només permet inserir o modificar files que continuen complint el WHERE de la vista |
Una vista sobre una sola taula, sense agrupacions,
DISTINCTni columnes calculades, sol ser actualitzable: unUPDATEsobre la vista modifica la taula base. Les vistes ambJOINnomés ho són parcialment. Una vista materialitzada (CREATE MATERIALIZED VIEW) sí que emmagatzema el resultat i es refresca periòdicament: és una eina de rendiment per a informes.
10. Control de dades: usuaris, privilegis i rols
10.1 El principi de mínim privilegi
Cada usuari ha de tindre només els permisos imprescindibles per al seu treball i només durant el temps que els necessita. Si una aplicació es connecta com a administrador i patix una injecció SQL, l’atacant obté control total de la base de dades.
flowchart TB
subgraph EDUGEST[Esquema EDUGEST: propietari de les taules]
T[(Taules)]
V[(Vistes)]
end
S[rol_secretaria] -->|SELECT, INSERT, UPDATE| T
P[rol_profesorado] -->|SELECT vistes · UPDATE nota_final| V
C[rol_consulta] -->|SELECT vistes| V
u1([sec_ana]) --> S
u2([prof_marta]) --> P
u3([dir_jefatura]) --> C
app([app_edugest]) --> S10.2 Usuaris
Oracle 26ai (connectat com a SYSTEM a FREEPDB1)
CREATE USER prof_marta IDENTIFIED BY "Cambiar_2026"
DEFAULT TABLESPACE users
QUOTA 0 ON users -- no podrà crear objectes que ocupen espai
PASSWORD EXPIRE; -- haurà de canviar la contrasenya en entrar
ALTER USER prof_marta IDENTIFIED BY "Nueva_Clave_2026";
ALTER USER prof_marta ACCOUNT LOCK; -- bloquejar (baixa temporal)
ALTER USER prof_marta ACCOUNT UNLOCK;
DROP USER prof_marta CASCADE; -- CASCADE esborra també els seus objectes10.3 Privilegis de sistema i d’objecte
| Tipus | Què permet | Exemples |
|---|---|---|
| De sistema | Realitzar una acció en la base de dades | CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY TABLE, SELECT ANY TABLE |
| D’objecte | Realitzar una acció sobre un objecte concret | SELECT, INSERT, UPDATE, DELETE sobre una taula o vista; EXECUTE sobre un procediment; REFERENCES |
-- Privilegi de sistema: poder connectar-se
GRANT CREATE SESSION TO prof_marta;
-- Privilegis d'objecte (els concedeix el propietari, EDUGEST, o un administrador)
GRANT SELECT ON edugest.v_alumno_listado TO prof_marta;
GRANT SELECT, UPDATE (nota_final) ON edugest.matricula TO prof_marta; -- només eixa columna
-- Retirar privilegis
REVOKE UPDATE ON edugest.matricula FROM prof_marta;| Opció | Significat | Risc |
|---|---|---|
WITH ADMIN OPTION (privilegis de sistema i rols) | El receptor pot concedir el privilegi a altres | En revocar-lo, no es revoca en cascada a qui el va rebre |
WITH GRANT OPTION (privilegis d’objecte) | El receptor pot concedir el privilegi sobre l’objecte | En revocar-lo, sí es revoca en cascada |
Evita els privilegis
ANY(SELECT ANY TABLE,DROP ANY TABLE…): s’apliquen a tots els esquemes de la base de dades, inclosos els d’altres aplicacions.Des d’Oracle 23ai existixen els privilegis d’esquema, que limiten l’
ANYa un esquema concret:GRANT SELECT ANY TABLE ON SCHEMA edugest TO dir_jefatura;. Inclouen també les taules que es creen en el futur en eixe esquema.
10.4 Rols
Un rol és un conjunt de privilegis amb nom. S’assignen privilegis al rol i el rol als usuaris: així, quan arriba una professora nova basta amb una ordre.
CREATE ROLE rol_profesorado;
GRANT CREATE SESSION TO rol_profesorado;
GRANT SELECT ON edugest.v_alumno_listado TO rol_profesorado;
GRANT SELECT, UPDATE (nota_final) ON edugest.matricula TO rol_profesorado;
GRANT SELECT, INSERT, UPDATE ON edugest.falta_asistencia TO rol_profesorado;
GRANT rol_profesorado TO prof_marta;
REVOKE rol_profesorado FROM prof_marta;
DROP ROLE rol_profesorado;| Rol predefinit | Contingut | Ús |
|---|---|---|
CONNECT | CREATE SESSION | Usuaris que només es connecten |
RESOURCE | Crear taules, seqüències, procediments, triggers, tipus | Heretat de versions antigues |
DB_DEVELOPER_ROLE (23ai) | Els privilegis habituals d’un desenvolupador | Comptes de desenvolupament, com EDUGEST |
DBA | Tots els privilegis d’administració | Només administradors. Mai per a aplicacions |
10.5 Polítiques de contrasenyes: perfils
CREATE PROFILE perfil_personal LIMIT
FAILED_LOGIN_ATTEMPTS 5 -- bloqueig després de 5 intents fallits
PASSWORD_LOCK_TIME 1/24 -- durant 1 hora
PASSWORD_LIFE_TIME 180 -- caducitat en dies
PASSWORD_REUSE_MAX 5; -- no repetir les 5 últimes
ALTER USER prof_marta PROFILE perfil_personal;10.6 Consultar usuaris i privilegis
| Vista | Informació |
|---|---|
USER_SYS_PRIVS, USER_ROLE_PRIVS | Privilegis de sistema i rols de l’usuari connectat |
USER_TAB_PRIVS | Privilegis d’objecte concedits o rebuts per l’usuari |
ROLE_TAB_PRIVS, ROLE_SYS_PRIVS | Privilegis continguts en els rols |
SESSION_PRIVS, SESSION_ROLES | Privilegis actius en la sessió actual |
DBA_USERS, DBA_ROLE_PRIVS | (Administració) tots els usuaris i els seus rols |
10.7 Altres mesures de protecció
- Autenticació robusta: contrasenyes llargues, perfils amb caducitat i bloqueig, i comptes personals (res d’usuaris compartits).
- Protecció de credencials: mai escriguis contrasenyes en el codi font ni les pugis a Git. Usa variables d’entorn o gestors de secrets.
- Connexions segures: xifra el trànsit amb TLS (en Oracle, Native Network Encryption o TCPS).
- Exposició del servei: el port 1521 no ha d’estar accessible des d’Internet; només des dels servidors d’aplicació.
- Còpies de seguretat: Oracle Data Pump (
expdp/impdp) per a exportar esquemes i RMAN per a còpies físiques. Una còpia que no s’ha provat de restaurar no és una còpia. - Dades personals: vistes i privilegis per columna per a complir la minimització del RGPD (UD01).
Taller de rols i privilegis
Dissenya un rol, assigna’l a un usuari i comprova quines sentències pot executar. Els errors (ORA-01031, ORA-00942, ORA-01045) són els que torna Oracle.
SELECT ANY TABLEiGRANT ... WITH ADMIN OPTIONsón privilegis molt amplis. Concedix-los només quan existisca una raó justificada i documentada: el mínim privilegi és una bona pràctica de seguretat i un requisit de protecció de dades.
11. Diccionari de dades
El diccionari és el catàleg del SGBD: descriu tots els objectes. És la forma de comprovar allò que s’ha creat.
| Prefix | Mostra | Exemple |
|---|---|---|
USER_ | Els objectes del teu esquema | USER_TABLES |
ALL_ | Els objectes als quals tens accés | ALL_TABLES |
DBA_ | Tots els objectes (requerix privilegis) | DBA_TABLES |
SELECT table_name FROM user_tables ORDER BY 1;
SELECT column_name, data_type, data_length, data_precision, data_scale, nullable
FROM user_tab_columns WHERE table_name = 'ALUMNO' ORDER BY column_id;
SELECT index_name, index_type, uniqueness FROM user_indexes WHERE table_name = 'ALUMNO';
SELECT view_name, text FROM user_views;
SELECT object_name, object_type, status FROM user_objects ORDER BY object_type;12. Assistents i eines gràfiques
El criteri RA2.h demana usar assistents, eines gràfiques i els llenguatges DDL i DCL.
| Tasca | En SQL Developer | Allò que has de revisar |
|---|---|---|
| Crear una taula | Clic dret en Taules → Nova taula (mode avançat per a restriccions) | Pestanya DDL: el codi que s’executarà |
| Veure l’estructura | Doble clic sobre la taula → pestanyes Columnes, Restriccions, Índexs, DDL | Noms de les restriccions |
| Crear un usuari | Finestra DBA → Seguretat → Usuaris → Crear | Privilegis mínims |
| Generar l’esquema complet | Data Modeler → model relacional → Generar DDL | Ordre de creació i noms |
Usa l’assistent per a aprendre la sintaxi i per a tasques puntuals, però guarda sempre l’script SQL que genera. Un script es versiona en Git, es revisa, es pot repetir en un altre servidor i documenta exactament què es va fer. Un clic, no.
13. Errors freqüents
| Error | Missatge | Causa i solució |
|---|---|---|
| Crear una FK cap a una taula que no existix | ORA-00942 table or view does not exist | Crea abans la taula pare o afig la FK amb ALTER TABLE |
| Clau aliena cap a una columna sense PK/UNIQUE | ORA-02270 no matching unique or primary key | La columna referenciada ha de ser PK o UNIQUE |
| Tipus distints entre FK i PK | Funciona, però provoca conversions i errors | Declara la FK amb el mateix tipus i grandària que la PK |
| Esborrar una taula referenciada | ORA-02449 unique/primary keys referenced by foreign keys | DROP TABLE ... CASCADE CONSTRAINTS o esborra abans les filles |
Usar ADD COLUMN | ORA-00904 invalid identifier | En Oracle és ALTER TABLE t ADD (col tipo) |
| Nom de restricció repetit | ORA-02264 name already used by an existing constraint | Els noms de restricció són únics en tot l’esquema |
Cadena buida en una columna NOT NULL | ORA-01400 | En Oracle '' és NULL |
14. Resum
- El DDL defineix l’estructura i el DCL controla l’accés. En Oracle, cada sentència DDL confirma la transacció en curs.
- Oracle emmagatzema les taules en segments dins de tablespaces, en blocs de dades; cada fila té un
ROWID. - Tria els tipus pel seu ús:
VARCHAR2,CHAR,NUMBER(p,s),DATE/TIMESTAMPi, des de 23ai,BOOLEAN. En Oracle,''ésNULL. - Implanta totes les restriccions del disseny amb nom:
PRIMARY KEY,UNIQUE,FOREIGN KEY,NOT NULLiCHECK. ALTER TABLEmodifica l’estructura;DROPiTRUNCATEsón destructius.- Les columnes identitat i les seqüències generen claus artificials; els índexs acceleren les cerques a canvi d’escriptures més lentes.
- Les vistes simplifiquen i protegixen l’accés. Els usuaris, privilegis i rols apliquen el principi de mínim privilegi.
- El diccionari de dades permet comprovar tot allò creat.