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.

Resultats d'aprenentatge i criteris d'avaluació
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).

UD05 · 17 hores d'aula Teoria 9 h · Pràctica 8 hDel 14/12/2026 al 21/01/2027
SessióHoresTipusContingutOn
11TeoriaSQL i Oracle. Emmagatzematge de la informació§1 i §2
22TeoriaTipus de dades d’Oracle§3 · calculadora de NUMBER(p, s)
32TeoriaCREATE TABLE i restriccions d’integritat§4 i §5 · constructor de CREATE TABLE
42PràcticaPrimeres taules i restriccions en OraclePràctica 5.1
52PràcticaDel diagrama de Chen al DDLPràctica 5.2
61TeoriaModificar i eliminar l’estructura (ALTER, DROP)§6
71PràcticaEvolució de l’esquema amb ALTERPràctica 5.5
81TeoriaSeqüències, identitat, índexs i vistes§7, §8 i §9
91PràcticaÍndexs, vistes i seqüències en EduGestPràctica 5.6
102TeoriaUsuaris, rols i privilegis. Diccionari de dades i eines§10 a §12 · taller de privilegis
111PràcticaUsuaris, rols i privilegis en EduGestPràctica 5.7
121PràcticaImplementació d’EduGestProjecte EduGest-5
Treball autònom (fora de l'horari d'aula): Pràctica 5.3 (biblioteca: script complet i bateria de proves) · Pràctica 5.4 (sis casos per a implementar) · Pràctica 5.8 (depurar un script defectuós)

En esta unitat passes del paper al SGBD. Executa cada sentència mentres llegixes: un CREATE TABLE que 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 NULL i CHECK.
  • 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.

Sessió 1 1 h Teoria · SQL, Oracle i emmagatzematge
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

SubllenguatgeSentènciesPer a quèUnitat
DDLCREATE, ALTER, DROP, TRUNCATE, RENAME, COMMENTDefinir l’estructuraUD05
DCLGRANT, REVOKEControlar l’accésUD05
DMLSELECT, INSERT, UPDATE, DELETE, MERGEConsultar i modificar dadesUD06 a UD08
TCLCOMMIT, ROLLBACK, SAVEPOINTControlar transaccionsUD08

En Oracle, cada sentència DDL executa un COMMIT implícit abans i després d’executar-se. Si tenies canvis de dades pendents i llances un CREATE TABLE, eixos canvis queden confirmats i ja no podràs desfer-los amb ROLLBACK.

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:

CREATE TABLE producto (
    id_producto  NUMBER(6) GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    nombre       VARCHAR2(100) NOT NULL,
    precio       NUMBER(8,2) CHECK (precio >= 0),
    activo       BOOLEAN DEFAULT TRUE      -- BOOLEAN des de 23ai
);
CREATE TABLE producto (
    id_producto  INT AUTO_INCREMENT PRIMARY KEY,
    nombre       VARCHAR(100) NOT NULL,
    precio       DECIMAL(8,2) CHECK (precio >= 0),
    activo       BOOLEAN DEFAULT TRUE
) ENGINE = InnoDB;
CREATE TABLE producto (
    id_producto  INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    nombre       VARCHAR(100) NOT NULL,
    precio       NUMERIC(8,2) CHECK (precio >= 0),
    activo       BOOLEAN DEFAULT TRUE
);

1.3 Regles d’escriptura en Oracle

  • Les paraules reservades i els identificadors no distingeixen majúscules: CREATE TABLE Alumno crea la taula ALUMNO. 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ínea i /* 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
EstructuraQuè és
Bloc de dadesLa 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
SegmentTot l’espai d’un objecte: una taula, un índex…
TablespaceContenidor lògic de segments. USERS és el de les dades d’usuari; SYSTEM i SYSAUX, els del diccionari
Fitxer de dadesFitxer 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 BY pot tornar les files en qualsevol ordre, i eixe ordre pot canviar.


Sessió 2 2 h Teoria · Tipus de dades d’Oracle
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

CategoriaTipusDescripcióExemple d’ús
TextVARCHAR2(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 espaisdni, codis de longitud fixa
NVARCHAR2(n)Text Unicode en el joc de caràcters nacionalRarament necessari amb AL32UTF8
CLOBText molt llarg (gigabytes)observacions, documents
NumèricNUMBER(p, s)Nombre exacte amb p dígits en total i s decimalsimports, notes, quantitats
NUMBERSense precisió: qualsevol nombreevitar-lo en columnes de negoci
INTEGERSinònim de NUMBER(38)comptadors
BINARY_DOUBLEComa flotant IEEE 754càlculs científics
Data i horaDATEData i hora (fins a segons)data de naixement, de matrícula
TIMESTAMP(n)Data i hora amb fraccions de segonregistres d’auditoria
TIMESTAMP WITH TIME ZONEInclou la zona horàriaaplicacions internacionals
INTERVAL DAY TO SECONDDuradatemps d’una tasca
LògicBOOLEANTRUE, FALSE o NULL (des de 23ai)actiu, justificada
BinariBLOB, RAW(n)Dades binàriesfotografies, hashes
AltresJSONDocument JSON natiu (des de 21c)dades semiestructurades
VECTORVectors 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ésValor inseritValor guardat
NUMBER(4,2)-99,99 a 99,997.2567,26 (arredoneix)
NUMBER(4,2)123.5Error ORA-01438
NUMBER(5)-99999 a 9999912.713
NUMBER(8,2)fins a 999 999,991520.51520,50

3.3 Criteris per a triar el tipus

  1. 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.
  2. Té longitud fixa? CHAR només si sempre ocupa el mateix (DNI: CHAR(9)). En la resta, VARCHAR2.
  3. Necessita decimals exactes? Els diners es guarden sempre en NUMBER(p, s), mai en coma flotant.
  4. És una data? Usa DATE o TIMESTAMP, mai text: així pots ordenar, comparar i calcular.
  5. 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

ConcepteOracleMySQL / MariaDBPostgreSQLSQL Server
Text variableVARCHAR2(n)VARCHAR(n)VARCHAR(n)VARCHAR(n)
EnterNUMBER(10)INTINTEGERINT
Decimal exacteNUMBER(p,s)DECIMAL(p,s)NUMERIC(p,s)DECIMAL(p,s)
Data sense horaDATE (inclou hora)DATEDATEDATE
AutoincrementIDENTITY o seqüènciaAUTO_INCREMENTIDENTITY o SERIALIDENTITY
LògicBOOLEAN (23ai)BOOLEAN (= TINYINT(1))BOOLEANBIT

En Oracle la cadena buida '' és NULL. INSERT INTO alumno (..., email) VALUES (..., '') guarda un NULL, i la condició email = '' mai no és vertadera. En MySQL i PostgreSQL la cadena buida i NULL són coses distintes. És una de les diferències que més errors provoca en migrar.

El tipus DATE d’Oracle sempre guarda l’hora. SYSDATE torna data i hora actuals. Si compares fecha_matricula = DATE '2025-09-15' i la fila es va inserir amb SYSDATE, 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ó.

Interactivo Calculadora de NUMBER(p, s) Oracle 26ai
Autoavaluació 2 preguntes
1 Què passa en inserir 123.456 en una columna NUMBER(5,2)?
2 Per a guardar un import en euros amb cèntims, quin tipus és més adequat?

Sessió 3 2 h Teoria · CREATE TABLE i restriccions

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 26ai
CREATE 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)
);
ElementSignificat
CREATE TABLE cicloCrea 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 KEYRestricció amb nom PK_CICLO: cod_ciclo és la clau primària (única i no nul·la)
NOT NULLLa 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àusulaEfecteExemple
DEFAULT exprS’usa si la columna no apareix en l’INSERTfecha_alta DATE DEFAULT SYSDATE
DEFAULT ON NULL exprS’usa també si s’inserix explícitament NULLconvocatoria NUMBER(1) DEFAULT ON NULL 1
GENERATED ALWAYS AS IDENTITYOracle genera el valor; no se’n pot inserir un de propiid NUMBER GENERATED ALWAYS AS IDENTITY
GENERATED BY DEFAULT ON NULL AS IDENTITYOracle genera el valor si no s’indica o si és NULLUsat en ALUMNO d’EduGest
GENERATED ALWAYS AS (expr) VIRTUALColumna virtual: es calcula, no s’emmagatzematotal 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óGarantixPrefix del nomError si s’incompleix
NOT NULLLa columna té valornn_ORA-01400 cannot insert NULL
PRIMARY KEYIdentificació única i no nul·la de cada filapk_ORA-00001 unique constraint violated
UNIQUENo hi ha valors repetits (admet diversos NULL)uq_ORA-00001
FOREIGN KEYEl valor existix en la taula referenciadafk_ORA-02291 parent key not found / ORA-02292 child record found
CHECKEs complix una condició sobre la filack_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’error ORA-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
ComponentSignificat
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 CASCADEEn esborrar l’alumne, s’esborren les seues matrícules
ON DELETE SET NULLEn 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è DEPARTAMENTO i PROFESOR es referencien mútuament).
  • Una clau aliena admet NULL llevat que afigques NOT NULL. Una fila amb la clau aliena a NULL no 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 és NULL, la condició nota_final BETWEEN 0 AND 10 és desconeguda i el CHECK l’accepta. Si la columna ha de tindre valor, afig NOT NULL.

Un CHECK no pot usar subconsultes, ni consultar altres taules, ni cridar SYSDATE. 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.

Interactivo Constructor de CREATE TABLE Oracle 26ai · restricciones siempre con nombre

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.

Autoavaluació 2 preguntes
1 Què fa Oracle amb una cadena buida '' en una columna VARCHAR2 amb NOT NULL?
2 Quantes claus primàries pot tindre una taula i quantes UNIQUE?

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 obligatoriNOT NULL
Regla de filaCHECK (condició sobre la mateixa fila)
Clau aliena obligatòria (participació mínima 1)FOREIGN KEY + columna NOT NULL
Relació 1:1 amb clau alienaFOREIGN KEY + UNIQUE sobre la clau aliena
Esborrat en cascadaON DELETE CASCADE
Posada a nulsON DELETE SET NULL (la columna ha d’admetre NULL)
Esborrat restringitno s’escriu res: és el comportament per defecte d’Oracle
Canvi de clau en cascadaNo 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.


Sessió 6 1 h Teoria · Modificar i eliminar l’estructura
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’ENABLE falla. Amb ENABLE NOVALIDATE nomé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ènciaEsborraEstructuraEs pot desfer?
DELETE FROM t (DML, UD08)Files (totes o algunes)Es mantéSí, amb ROLLBACK
TRUNCATE TABLE tTotes les filesEs mantéNo (és DDL)
DROP TABLE tTaula i dadesDesapareixNomés des de la paperera
DROP TABLE t PURGETaula i dadesDesapareixNo

TRUNCATE i DROP ... PURGE no 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';

Sessió 8 1 h Teoria · Seqüències, identitat, índexs i vistes

7. Seqüències i columnes identitat

Per a generar identificadors artificials (claus subrogades) hi ha dos mecanismes:

CREATE TABLE incidencia (
    id_incidencia NUMBER(8) GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1)
                  CONSTRAINT pk_incidencia PRIMARY KEY,
    descripcion   VARCHAR2(200) NOT NULL
);

INSERT INTO incidencia (descripcion) VALUES ('Proyector del aula 12 averiado');

Oracle crea internament una seqüència associada a la columna. És l’opció més senzilla des d’Oracle 12c.

CREATE SEQUENCE seq_incidencia START WITH 1 INCREMENT BY 1 NOCACHE;

CREATE TABLE incidencia (
    id_incidencia NUMBER(8) DEFAULT seq_incidencia.NEXTVAL
                  CONSTRAINT pk_incidencia PRIMARY KEY,
    descripcion   VARCHAR2(200) NOT NULL
);

SELECT seq_incidencia.NEXTVAL FROM dual;   -- següent valor
SELECT seq_incidencia.CURRVAL FROM dual;   -- últim valor obtingut en esta sessió

Una seqüència és un objecte independent: pot compartir-se entre diverses taules.

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é indexarNo 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 selectiusColumnes amb pocs valors distints (turno: M/T)
Columnes usades per a ordenar resultats gransColumnes que es modifiquen constantment

Un índex accelera les lectures però alenteix les escriptures: cada INSERT, UPDATE o DELETE ha 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.

Laboratorio · ¿Cuánto cuesta buscar una fila?
Recorrido completo (sin índice)
Búsqueda con índice B-tree

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àusulaEfecte
OR REPLACESi la vista existix, la substituïx sense perdre els privilegis concedits
WITH READ ONLYNo permet INSERT, UPDATE ni DELETE a través de la vista
WITH CHECK OPTIONNomés permet inserir o modificar files que continuen complint el WHERE de la vista

Una vista sobre una sola taula, sense agrupacions, DISTINCT ni columnes calculades, sol ser actualitzable: un UPDATE sobre la vista modifica la taula base. Les vistes amb JOIN nomé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.


Sessió 10 2 h Teoria · Usuaris, rols i privilegis

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]) --> S

10.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 objectes

10.3 Privilegis de sistema i d’objecte

TipusQuè permetExemples
De sistemaRealitzar una acció en la base de dadesCREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY TABLE, SELECT ANY TABLE
D’objecteRealitzar una acció sobre un objecte concretSELECT, 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óSignificatRisc
WITH ADMIN OPTION (privilegis de sistema i rols)El receptor pot concedir el privilegi a altresEn 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’objecteEn 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’ANY a 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 predefinitContingutÚs
CONNECTCREATE SESSIONUsuaris que només es connecten
RESOURCECrear taules, seqüències, procediments, triggers, tipusHeretat de versions antigues
DB_DEVELOPER_ROLE (23ai)Els privilegis habituals d’un desenvolupadorComptes de desenvolupament, com EDUGEST
DBATots 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

VistaInformació
USER_SYS_PRIVS, USER_ROLE_PRIVSPrivilegis de sistema i rols de l’usuari connectat
USER_TAB_PRIVSPrivilegis d’objecte concedits o rebuts per l’usuari
ROLE_TAB_PRIVS, ROLE_SYS_PRIVSPrivilegis continguts en els rols
SESSION_PRIVS, SESSION_ROLESPrivilegis 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.

Interactivo Taller de roles y privilegios Diseña el rol y comprueba qué puede hacer cada usuario
Resultado de la prueba…

SELECT ANY TABLE i GRANT ... WITH ADMIN OPTION só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.

Autoavaluació 2 preguntes
1 Un usuari té SELECT sobre ALUMNO però rep ORA-01045 en connectar-se. Què falta?
2 Quin avantatge principal té agrupar privilegis en un rol?

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.

PrefixMostraExemple
USER_Els objectes del teu esquemaUSER_TABLES
ALL_Els objectes als quals tens accésALL_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.

TascaEn SQL DeveloperAllò que has de revisar
Crear una taulaClic dret en Taules → Nova taula (mode avançat per a restriccions)Pestanya DDL: el codi que s’executarà
Veure l’estructuraDoble clic sobre la taula → pestanyes Columnes, Restriccions, Índexs, DDLNoms de les restriccions
Crear un usuariFinestra DBA → Seguretat → Usuaris → CrearPrivilegis mínims
Generar l’esquema completData Modeler → model relacional → Generar DDLOrdre 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

ErrorMissatgeCausa i solució
Crear una FK cap a una taula que no existixORA-00942 table or view does not existCrea abans la taula pare o afig la FK amb ALTER TABLE
Clau aliena cap a una columna sense PK/UNIQUEORA-02270 no matching unique or primary keyLa columna referenciada ha de ser PK o UNIQUE
Tipus distints entre FK i PKFunciona, però provoca conversions i errorsDeclara la FK amb el mateix tipus i grandària que la PK
Esborrar una taula referenciadaORA-02449 unique/primary keys referenced by foreign keysDROP TABLE ... CASCADE CONSTRAINTS o esborra abans les filles
Usar ADD COLUMNORA-00904 invalid identifierEn Oracle és ALTER TABLE t ADD (col tipo)
Nom de restricció repetitORA-02264 name already used by an existing constraintEls noms de restricció són únics en tot l’esquema
Cadena buida en una columna NOT NULLORA-01400En Oracle '' és NULL

Repassa els termes de la UD05 Prem una targeta per a girar-la

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/TIMESTAMP i, des de 23ai, BOOLEAN. En Oracle, '' és NULL.
  • Implanta totes les restriccions del disseny amb nom: PRIMARY KEY, UNIQUE, FOREIGN KEY, NOT NULL i CHECK.
  • ALTER TABLE modifica l’estructura; DROP i TRUNCATE só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.

15. Autoavaluació

Autoavaluació 10 preguntes
1 Quin tipus de dades és més adequat per a un codi postal espanyol com 03690?
2 S’inserix el valor 123.456 en una columna NUMBER(5,2). Què passa?
3 Després d’executar un INSERT sense confirmar, s’executa CREATE TABLE i després ROLLBACK. Què passa amb l’INSERT?
4 Quina restricció permet diversos valors NULL però cap valor repetit?
5 Un CHECK (nota BETWEEN 0 AND 10) i s’inserix una fila amb nota NULL. Què passa?
6 Quina és la sintaxi correcta en Oracle per a afegir una columna?
7 Què fa WITH CHECK OPTION en una vista?
8 Una aplicació web només necessita consultar i inserir matrícules. Quina opció aplica el mínim privilegi?
9 Quina diferència hi ha entre WITH ADMIN OPTION i WITH GRANT OPTION en revocar?
10 Per què convé crear un índex sobre una clau aliena en Oracle?

Referències