Definición y control en SQL: DDL, DCL y TCL
El estándar ANSI/ISO SQL (formalizado como SQL-92, adoptado por ANSI e ISO en 1992, y continuado en ISO/IEC 9075) organiza las sentencias en varios sublenguajes. Además del DML (consulta y manipulación de datos, con SELECT, INSERT, UPDATE, DELETE), los tres sublenguajes de definición y control son:
-
DDL (Data Definition Language, Lenguaje de Definición de Datos): define la estructura lógica de la base de datos.
-
DCL (Data Control Language, Lenguaje de Control de Datos): gestiona los permisos y autorizaciones.
-
TCL (Transaction Control Language, Lenguaje de Control de Transacciones): gestiona las transacciones.
El estándar SQL-92 define todos los elementos principales del lenguaje: sentencias, cláusulas y funciones. El módulo SQL/CLI (Call Level Interface) proporciona un conjunto de funciones de bajo nivel para acceder a bases de datos relacionales desde un lenguaje anfitrión.
DDL — Lenguaje de Definición de Datos
El DDL permite a los usuarios realizar tareas de definición de las estructuras que almacenarán los datos (tablas, vistas, índices, disparadores, etc.). Sus sentencias principales son CREATE, ALTER y DROP (también TRUNCATE):
| Sentencia | Función |
|---|---|
CREATE | Crea un nuevo objeto (tabla, vista, índice, procedimiento…). La declaración más común es CREATE TABLE. |
ALTER | Modifica la estructura de un objeto existente. |
DROP | Elimina un objeto existente por completo. |
TRUNCATE | Elimina todo el contenido de una tabla conservando su estructura. |
ALTER TABLE modifica una tabla ya existente:
-- Añadir una columna
ALTER TABLE tabla_nombre ADD columna_nombre tipo_dato;
ALTER TABLE Clientes ADD telefono VARCHAR(10);
-- Modificar el tipo de una columna (sintaxis MySQL/Oracle)
ALTER TABLE tabla_nombre MODIFY COLUMN columna_nombre nuevo_tipo_dato;
ALTER TABLE UBICACIONES MODIFY PROVINCIA varchar(25);
-- Eliminar una columna
ALTER TABLE tabla_nombre DROP COLUMN columna_nombre;
DROP TABLE elimina la estructura de la tabla junto con todos los datos almacenados; al hacerlo también se eliminan los datos, las restricciones, los índices y los desencadenadores (triggers) asociados. En MySQL se pueden borrar varias tablas a la vez: DROP TABLE tabla1, tabla2, tabla3;. Si se intenta borrar una tabla que no existe sin la cláusula IF EXISTS, se muestra un mensaje de error y la ejecución del código restante se detiene; por eso se usa DROP TABLE IF EXISTS ... o, para bases de datos, DROP DATABASE [IF EXISTS] base_de_datos. Si se elimina una tabla de la que dependía una vista, esa vista debe eliminarse con DROP VIEW.
Una característica relevante es que PostgreSQL admite DDL transaccional: permite revertir con ROLLBACK sentencias CREATE y otros comandos DDL dentro de una transacción, algo que otros gestores (como Oracle o MySQL, donde el DDL provoca commit implícito) no permiten.
En el diseño de estructuras se distinguen las claves: la clave primaria identifica de forma única cada fila, es única y no admite valores nulos; la clave foránea (o ajena/externa) es una columna que hace referencia a la clave primaria de otra tabla. En las relaciones referenciales, el modo RESTRICT impide borrar una fila si existen filas relacionadas, mientras que CASCADE propaga la eliminación borrando también las filas relacionadas en otras tablas.
DCL — Lenguaje de Control de Datos
El modelo de autorización SQL define la forma en que los usuarios pueden acceder a los objetos de la base de datos. El DCL lo implementa con GRANT (otorgar) y REVOKE (revocar); en Transact-SQL existe además DENY, que es también una instrucción DCL.
GRANTproporciona a los usuarios autorización para realizar una o más operaciones sobre una tabla. Sintaxis general:
GRANT lista-operaciones ON nombretabla TO lista-usuarios [WITH GRANT OPTION];
GRANT SELECT ON clientes TO jose;
GRANT ALL ON EMPLEADOS TO USUARIO1;
GRANT SELECT, UPDATE ON EMPLEADOS TO USUARIO1;
El privilegio se puede acotar a columnas concretas. Para permitir a un usuario actualizar solo la columna SALARIO sin poder dar de alta empleados:
GRANT SELECT, UPDATE(SALARIO) ON EMPLEADOS TO USUARIO1;
La cláusula WITH GRANT OPTION permite al usuario receptor otorgar a su vez esos privilegios a terceros.
REVOKEelimina una autorización otorgada previamente por unGRANT. Sintaxis:REVOKE lista-operaciones ON nombretabla FROM lista-usuarios;. Para revocar la autorización de actualizar columnas específicas (o cualquier columna) se emplea igualmenteREVOKE.
TCL — Control de transacciones (ACID)
Una transacción es un conjunto de órdenes que se ejecutan formando una unidad de trabajo atómica e indivisible; se diferencia de una simple consulta, que solo recupera datos. Que un sistema sea transaccional significa que puede mantener la integridad de los datos. Toda transacción debe cumplir las propiedades ACID:
-
Atomicidad: la transacción se ejecuta completa o no se ejecuta en absoluto.
-
Consistencia: lleva la base de datos de un estado válido a otro válido.
-
Aislamiento (Isolation): las operaciones de otras transacciones no pueden acceder a los datos modificados por una transacción que aún no se ha completado.
-
Durabilidad: una vez confirmada, la transacción persiste y puede recuperarse ante una falla del sistema.
Las sentencias de control son:
-
COMMIT: confirma los cambios de forma permanente. -
ROLLBACK: revierte o restituye todos los cambios realizados desde el inicio de la transacción, o desde un punto de salvaguarda, restaurando el estado anterior. Se relaciona directamente con el control de integridad. -
SAVEPOINT: define un punto de salvaguarda dentro de una transacción (SAVEPOINT nombre_punto;), al que se puede volver conROLLBACK TO.
Niveles de aislamiento y anomalías
El nivel de aislamiento determina la separación entre las modificaciones realizadas por transacciones concurrentes. El estándar SQL define tres fenómenos o anomalías:
| Fenómeno | Descripción |
|---|---|
| Dirty read (lectura sucia) | Una transacción lee datos escritos por otra transacción no confirmada. |
| Non-repeatable read (lectura no repetible) | Al releer un dato, se obtiene un valor diferente porque otra transacción lo modificó y confirmó. |
| Phantom read (lectura fantasma) | Una transacción ve filas nuevas añadidas por otra transacción tras haber comenzado la lectura inicial. |
El problema más importante es la lectura de resultados de transacciones no confirmadas (lecturas sucias), que provoca inconsistencia en los valores. Los cuatro niveles de aislamiento, de menor a mayor, y el fenómeno que cada uno resuelve son:
| Nivel | Permite | Resuelve |
|---|---|---|
| Read Uncommitted | dirty, non-repeatable, phantom | (ninguno) — puede leer datos no confirmados |
| Read Committed | non-repeatable, phantom | dirty read (lecturas sucias) |
| Repeatable Read | phantom | lecturas no repetibles |
| Serializable | (ninguno) | todos, con lecturas en serie |
Read Committed es el nivel predeterminado en la mayoría de gestores relacionales (Oracle, PostgreSQL, SQL Server). Serializable es el más estricto: ofrece máxima integridad pero es el que más sacrifica rendimiento y concurrencia. Evitar las lecturas no repetibles es especialmente importante en claves primarias o ajenas, pues su alteración causaría gran pérdida de consistencia.
Fuentes
-
PostgreSQL Global Development Group — Transaction Isolation (niveles y fenómenos SQL, nivel por defecto Read Committed): https://www.postgresql.org/docs/current/transaction-iso.html
-
Oracle / MySQL — GRANT Statement y REVOKE Statement (sintaxis DCL): https://dev.mysql.com/doc/refman/8.0/en/grant.html
-
Oracle — ALTER TABLE, DROP TABLE, TRUNCATE y SAVEPOINT/ROLLBACK (SQL Language Reference): https://docs.oracle.com/en/database/oracle/oracle-database/
-
ISO/IEC 9075 (ANSI/ISO SQL, base del estándar SQL-92): https://www.iso.org/standard/63555.html
-
PostgreSQL — DDL transaccional (Transactions): https://www.postgresql.org/docs/current/tutorial-transactions.html