DML DDL
Breves apuntes para el lenguaje de manipulación de datos o DML (Data Manipulation Language) y para el lenguaje de definición de datos o DDL (Data Definition Language). Comandos como CREATE, DROP, INSERT o UPDATE.
Crear Tablas y Tipos de Datos
Sección titulada «Crear Tablas y Tipos de Datos»En la siguiente tabla llamada “tabla” doy una breve descripción de todos los tipos de datos interesantes. La iré usando en el resto de ejemplos
CREATE TABLE tabla (  oficio VARCHAR(4), -- max. "zzzz"  edad NUMERIC(2), -- max. 99  altura NUMERIC (2,1), -- max. 9,9  fecha DATE, -- formato fecha de oracle, se inserta con to_date("string","formato")  dinero NUMERIC(100) DEFAULT 0, -- por defecto todos empiezan sin dinero  nombre VARCHAR(15) CONSTRAINT NN_tabla_nombre NOT NULL, -- no puede haber nombres nulos  nss VARCHAR(9) CONSTRAINT PK_tabla PRIMARY KEY, -- el numero de la ss es la clave primaria  -- PRIMARY KEY (nombre,altura), -- también se pueden hacer combinaciones  npasaporte VARCHAR(10) UNIQUE, -- no hay dos números iguales, pero puede haber nulos  dni VARCHAR(9) UNIQUE NOT NULL, -- no hay dos números iguales y todos tienen (c. candidata)  departamento NUMERIC(2) DEFAULT 10 REFERENCES departamentos (deptno), -- clave foránea  -- También podemos hacerlo global con:  --     PRIMARY KEY (nombre,departamento),  --     FOREING KEY (departamento) REFERENCES departamentos  -- Que hacer si desaparece un departamento:  --    -- Se borran todos los de ese departamento  --    [...] REFERENCES departamento (deptno) ON DELETE CASCADE  --     -- Se dejan sin departamento (a nulos) (aunque hay otras opciones como DEFAULT etc)  --    [...] REFERENCES departemento (deptno) ON DELETE SET NULL  salario NUMERIC(6,2) CONSTRAINT CK_sal_min CHECK (salario > 1800), /* no puede haber gente bajo el salario mín. */  CONSTRAINT CH_no_enanos_pobres (altura < 1.0 AND dinero < 100), -- versión global);Modificar Tablas (Oracle)
Sección titulada «Modificar Tablas (Oracle)»Añadir o Modificar Columnas
Sección titulada «Añadir o Modificar Columnas»ALTER TABLE tabla ADD signo_zodiaco VARCHAR(12) NOT NULL; -- Añadir (signos del zodiaco)ALTER TABLE tabla MODIFY dni VARCHAR(9) UNIQUE; -- Modificar (permitir gente sin dni)Eliminar columnas
Sección titulada «Eliminar columnas»-- Eliminar una columna (edad)ALTER TABLE tabla DROP COLUMN edad;-- Eliminar Columnas con claves (elimina las claves foráneas en cascada)ALTER TABLE tabla DROP COLUMN departamento CASCADE CONSTRAINTS;Modificar Restricciones
Sección titulada «Modificar Restricciones»-- Añadir y Eliminar restriccionesALTER TABLE tabla ADD CONSTRAINT CK_no_menas (edad > 18 AND dni IS NOT NULL);ALTER TABLE tabla DROP CONSTRAINT CK_sal_min;Borrar Tablas (Oracle)
Sección titulada «Borrar Tablas (Oracle)»DROP TABLE tabla1; -- Borrar tabla sin dependencias con otras tablasDROP TABLE tabla2 PURGE; -- Borrar tabla sin dejar registrosDROP TABLE tabla2 CASCADE CONSTRAINTS; -- Borrar tabla y todas las que dependan de ellaGestión de Índices (Oracle)
Sección titulada «Gestión de Índices (Oracle)»CREATE UNIQUE INDEX dnis ON tabla (dni); -- Índice de valores únicos (clave candidata)CREATE INDEX edades ON tabla (edad); -- Índice de valores repetidos (tramos de edades)DROP INDEX dni; -- Eliminar ÍndiceInsertar Datos
Sección titulada «Insertar Datos»Insertar filas (podría fallar dependiendo de las restricciones de la tabla)
INSERT INTO tabla VALUES ("panadero",42,[...]); -- Insertar todos los valores en ordenINSERT INTO tabla (dni,edad) VALUES ("123456789A",18); -- Solo los seleccionadosVolcar columnas enteras a otras tablas
INSERT INTO dnisyedades (dni,edad) SELECT dni, edad FROM tabla;Actualizar Datos
Sección titulada «Actualizar Datos»Aumentarle el salario a alguien (dado su dni)
UPDATE tablaSET salario = salario + 100WHERE dni LIKE "123456789A";Aumentar a todos los que cobren 1000 o menos
UPDATE tablaSET salario = salario + 10WHERE salario <= 1000;Borrar Filas
Sección titulada «Borrar Filas»DELETE FROM tabla WHERE dni LIKE "123456789A"; -- Borrar una fila en específicoDELETE FROM tabla WHERE altura < 1.0; -- Borrar a todos los enanosSeguridad
Sección titulada «Seguridad»Gestión de Roles
Sección titulada «Gestión de Roles»CREATE ROLE usuario_basico; -- Crear un rolGRANT usuario_basico TO pringados; -- Asignamos rol al rol pringadosGRANT usuario_basico TO "pepe.perez"; -- Asignamos el rol a un usuarioEn Oracle existen varios roles por defecto:
- PUBLIC (por defecto)
- CONNECT (lectura)
- RESOURCE (escritura)
- DBA (administrador)
GRANT usuario_basico TO PUBLIC; -- Ahora todos pueden hacer lo que haga un "usuario_basico"GRANT RESOURCE TO "pepe.perez"; -- Ahora puede escribirGRANT RESOURCE TO "pepe.perez" WITH ADMIN OPTIONS; -- Y puede ascender a otros a su mismo rolREVOKE CREATE ANY TABLE FROM "pepe.perez"; -- Ya no puede crear tablas públicasREVOKE RESOURCE FROM "pepe.perez"; -- Ya no puede escribirREVOKE ALL_PRIVILEGES FROM "pepe.perez"; -- Ya no puede hacer nadaPermisos sobre objetos
Sección titulada «Permisos sobre objetos»GRANT SELECT, UPDATE(salario) ON banco TO "el_jefe"; -- Actualizar la columna salario y leerREVOKE UPDATE(salario) ON banco TO "el_jefe"; -- Ya no puede dar aumentosREVOKE ALL ON banco TO "el_jefe"; -- Ya no puede hacer nada en la tabla "banco"¿Como dar permisos solo a partes de una tabla? La solución son las vistas
CREATE VIEW departmento2 AS SELECT * FROM tabla WHERE departamento = 2; -- El departamento 2GRANT ALL ON departamento2 TO "manager_del_dept_2"; -- Que controla el manager del dept. 2REPLACE VIEW departemeto2 AS SELECT * FROM tabla WHERE departemento <= 2; -- El "departamento-- 2" a absorbido a todos los departamentos inferiores a elDROP VIEW departemento2; -- Se borra la vistaTransacciones
Sección titulada «Transacciones»ROLLBACK; -- Deshace todos los camios desde que comenzó la transacciónSAVEPOINT punto_guardado_1; -- Guarda el estado de la base de datosROLLBACK TO punto_guardado_1; -- Retrocede hasta dicho punto de salvadoCOMMIT; -- Finalizamos la transacción correctamenteConcurrencia (Oracle)
Sección titulada «Concurrencia (Oracle)»SET TRANSACTION READ ONLY; -- Declaramos una transacción solo de lectura (mejora rendimiento)SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- SerializableSET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- Estado por defectoPor defecto el SGDB realiza bloqueos automáticos pero podemos realizar bloqueos manuales.
LOCK TABLE tabla IN [SHARE|EXCLUSIVE] MODE [NOWAIT|WAIT n]; -- Bloquear una tabla y opcionesSELECT [...] FOR UPDATE OF dni [NOWAIT|WAIT n]; -- Bloque una fila en específicoCatálogos o Metadatos
Sección titulada «Catálogos o Metadatos»En cualquier SGDB existen tablas con metadatos. Son de dos tipos:
- *_TABLES: Para las tablas con algunos datos como nombre, nº de bloques, nº de columnas.
SELECT * FROM USER_TABLES; -- Todas las tablas que el usuario a creadoSELECT * FROM ALL_TABLES; -- Todas las tablas a las que el usuario tiene accesoSELECT * FROM DBA_TABLES; -- Para administradores- *_CONSTRAINTS: Para las restricciones con algunos datos como nombres, condición de búsqueda o dueño.
SELECT * FROM USER_CONSTRAINTS; -- Restricciones de las tablas del usuarioSELECT * FROM ALL_CONSTRAINTS; -- Restricciones de todas las tablasSELECT * FROM DBA_CONSTRAINTS; -- Para administradores