Viernes, 12 Junio 2020 03:14

Gestionando Objetos de Esquema

Rate this item
(0 votes)

Objetivos:

•Modificar tablas con la sentencia ALTER TABLE.

•Agregar restricciones.
•Crear índices.
•Crear índices mediante la sentencia CREATE TABLE.
•Crear índices basados en funciones.
•Borrar columnas y definir columnas como UNUSED.
•Realizar operaciones FLASHBACK.

NOTA: Usamos como ejemplo la base de datos: ORCL, la cual viene por defecto en cualquier versión de ORACLE.

Sentencia ALTER TABLE
Después de crear una tabla, puede que necesite cambiar la estructura de tabla porque ha omitido una columna, se debe cambiar la definición de columna o debe eliminar columnas. Puede hacerlo mediante la sentencia ALTER TABLE.
 

Utilice la sentencia ALTER TABLE para:
•Agregar una nueva columna.
•Modificar una columna existente.
•Definir un valor por defecto para la nueva columna.
•Borrar una columna.

Agregar Columnas.

•No puede especificar dónde aparecerá la columna. La nueva columna se convierte en la última.
 
Nota: Si una tabla ya contiene filas cuando se agrega una columna, la nueva columna es nula inicialmente para todas las filas. No puede agregar una columna NOT NULL obligatoria a una tabla que contiene datos en otras columnas. Sólo puede agregar una columna NOT NULL a una tabla vacía.
 
Sintaxis:
ALTER TABLE <table_name> 
SET UNUSED(<column_name>);
--O--
ALTER TABLE <table_name>
SET UNUSED COLUMN <column_name>;
 
Nota: Una vez una columna es SET UNUSED no es posible restablecerla nuevamente(SET USED), por tanto, la data se pierde. Las instrucciones para definir una columna como UNUSED son parecidas a las que se aplican al borrado de una columna.

Opción DROP UNUSED COLUMNS.

DROP UNUSED COLUMNS elimina de la tabla todas las columnas marcadas actualmente como no utilizadas. Puede utilizar esta sentencia si desea reclamar el espacio en disco adicional de las columnas no utilizadas en la tabla. Si la tabla no contiene tablas no utilizadas, la sentencia no devuelve ningún error.
 
Sintaxis:
ALTER TABLE <table_name>
DROP UNUSED COLUMNS;

Ejemplos:
ALTER TABLE random_table
SET UNUSED (col_precio, col_fecha);

ALTER TABLE random_table
DROP UNUSED COLUMNS;
/*Aquí eliminamos las columnas UNUSED.*/

Manejo de Restricciones.
Puede agregar/eliminar restricciones para tablas existentes mediante la sentencia ALTER TABLE.

Utilice la sentencia ALTER TABLE para:
•Agregar o borrar una restricción, pero sin modificar su estructura.
•Activar o desactivar restricciones.
•Agregar una restricción NOT NULL mediante la cláusula MODIFY.

 

Adición de una Restricción.

Sintaxis:
ALTER TABLE <table_name>
ADD [CONSTRAINT <constraint_name>]
type (<column_name>);
En la sintaxis:
table es el nombre de la tabla.
constraint es el nombre de la restricción.
type es el tipo de restricción.
column es el nombre de la columna a la que afecta la restricción.

La sintaxis de nombre de restricción es opcional, aunque se recomienda. Si no asigna nombres a las restricciones, el sistema los generará. 

Directrices:
•Puede agregar, borrar, activar o desactivar una restricción, pero no puede modificar su estructura.
•Puede agregar una restricción NOT NULL a una columna existente mediante la cláusula MODIFY de la sentencia ALTER TABLE.
 
Nota: Puede definir una columna NOT NULL sólo si la tabla está vacía o si la columna tiene un valor para todas las filas.

Ejemplos:
ALTER TABLE random_locations
ADD 
(
  CONSTRAINT pk_loc_id PRIMARY KEY(loc_id),
  CONSTRAINT ck_loc_desc CHECK(LENGTH(loc_descripcion) > 10)
);
/*En este ejemplo agregamos las restricciones PRIMARY KEY y CHECK a las columnas loc_id y loc_descripcion respectivamente.*/

ALTER TABLE random_table
ADD CONSTRAINT fk_col_loc_id
    FOREIGN KEY (col_locacion)
    REFERENCING random_locations(loc_id);
/*En este ejemplo agregamos una restricción de llave foránea a la columna col_locacion de la tabla random_table referenciando la columna loc_id de la tabla random_locations.*/

ON DELETE CASCADE.
La acción ON DELETE CASCADE permite que se supriman los datos de clave principal a los que se hace referencia desde la tabla secundaria, pero no que se actualicen. Cuando se suprimen los datos de la clave principal, también se suprimen todas las filas de la tabla secundaria que dependen de los valores de la clave principal suprimida. Para especificar esta acción referencial, incluya la opción ON DELETE CASCADE en la definición de la restricción FOREIGN KEY.
 
Ejemplos:
ALTER TABLE random_table
DROP CONSTRAINT fk_col_loc_id;
/*No es posible modificar un CONSTRAINT después de creado, ni tampoco es posible tener dos CONSTRAINT iguales para la misma columna de una tabla, es por ello que elimino el CONSTRAINT: fk_col_loc_id para luego crearlo con la cláusula  ON DELETE CASCADE.*/
 
ALTER TABLE random_table
ADD CONSTRAINT fk_col_loc_id 
    FOREIGN KEY (col_locacion)
    REFERENCING random_locations(loc_id)
    ON DELETE CASCADE;
/*Con esta opción, si eliminamos un registro de la tabla random_locations(tabla primaria), se eliminan sus hijos en la tabla random_table(tabla secundaria)*/
 

Diferir Restricciones.

Se puede diferir la comprobación de validez de las restricciones hasta el final de la transacción. Una restricción es diferida si el sistema comprueba que se satisface únicamente en el momento de la validación. Si se viola una restricción diferida, la validación provoca que se haga rollback de la transacción. Si una restricción es inmediata (no diferida), se comprueba al final de cada sentencia. Si se viola, se hace rollback de la sentencia de forma inmediata. Si una restricción provoca una acción (por ejemplo, DELETE CASCADE), esa acción se toma siempre como parte de la sentencia que la provocó, independientemente de que la restricción sea diferida o inmediata. Utilice la restricción SET CONSTRAINTS para especificar, para una transacción en particular, si se comprueban las restricciones diferibles después de cada sentencia DML o en el momento de la validación de la transacción. Para crear restricciones diferibles, debe crear un índice no único para esa restricción.


Las restricciones pueden tener estos atributos:
•Diferibles o no Diferibles: DEFERRABLE o NOT DEFERRABLE.

•Inicialmente diferidas o Inicialmente inmediatas: INITIALLY DEFERRED o INITIALLY IMMEDIATE.
Ejemplo:
ALTER TABLE random_table
ADD CONSTRAINT pk_col_id
PRIMARY KEY (col_id)
DEFERRABLE INITIALLY DEFERRED;
/*Acá le agregamos la restricción PRIMARY KEY a la columna col_id de la tabla: random_table, como dicha restricción es Inicialmente diferida, podemos insertar un mismo valor las veces que queramos y no recibiríamos ningún error, el problema estaría al momento de finalizar la transacción. Si tratamos de hacer COMMIT con los valore duplicados en esta columna, se levantaría una excepción indicando que no es posible completar la transacción y de paso se produciría un ROLLBACK automático.*/
 
SET CONSTRAINTS pk_col_id IMMEDIATE;
/*Luego de este ejemplo la validación del CONSTRAINT: pk_col_id  se haría al momento de ejecutar la instrucción DML. De este modo recibiríamos un error al tratar de insertar un valor duplicado en la columna col_id.*/ 
ALTER SESSION
SET CONSTRAINTS = IMMEDIATE;
/*Con este sentencia todos los CONSTRAINTS diferibles de la SESSION son cambiados a inmediatos.*/
 
Borrado de una Restricción.
Para borrar una restricción, puede identificar el nombre de restricción desde las vistas de diccionario de datos USER_CONSTRAINTS y USER_CONS_COLUMNS. Utilice a continuación la sentencia ALTER TABLE con la cláusula DROP. La opción CASCADE de la cláusula DROP provoca que se borre también cualquier restricción dependiente. 

Sintaxis:
ALTER TABLE table
DROP PRIMARY KEY | UNIQUE (column)|
CONSTRAINT constraint [CASCADE];

En la sintaxis:
table es el nombre de la tabla.
column es el nombre de la columna a la que afecta la restricción.
constraint es el nombre de la restricción.
CASCADE borra las restricciones dependientes de esta.

Al borrar una restricción de integridad, Oracle Server ya no fuerza esa restricción y ya no está disponible en el diccionario de datos.
 
Ejemplos:
SELECT *
FROM user_cons_columns
WHERE table_name LIKE 'RANDOM_%';
/*Consultamos el Diccionario de Datos para así ver nuestras restricciones, creadas en los ejemplos anteriores.*/
 
ALTER TABLE random_locations
DROP CONSTRAINT ck_loc_desc;
/*Eliminamos el CONSTRAINT: ck_loc_desc de la tabla random_locations, columna: loc_descripcion. Si consultamos la Vista: user_cons_columns o user_constraintsdel Diccionario de Datos notamos que ya no esta.*/
 
ALTER TABLE random_locations
DROP PRIMARY KEY CASCADE;
/*Acá eliminamos la llave primaria(pk_loc_id) de la tabla: random_locations, como especificamos: CASCADE de paso se elimina la restricción foránea(fk_col_loc_id) de la tabla random_table.*/
 
Desactivación de una Restricción.
Puede desactivar una restricción sin borrarla ni volverla a crear mediante la sentencia ALTER TABLE con la cláusula DISABLE.

Sintaxis:
ALTER TABLE table
DISABLE CONSTRAINT constraint [CASCADE];
 
Directrices:
•Puede utilizar la cláusula DISABLE en las sentencias CREATE TABLEALTER TABLE.
•La cláusula CASCADE desactiva las restricciones de integridad dependientes.
•La desactivación de una restricción de clave primaria o única elimina el índice único.
 
Ejemplo:
ALTER TABLE random_table
DISABLE CONSTRAINT pk_col_id;
/*Acá desactivamos la llave primaria de tabla random_table, por lo cual ahora podemos insertar valores duplicados en esta columna y completar la transacción(COMMIT). Si consultamos la vista: user_constraints del Diccionario de Datos notamos que la columna status nos dice que esta disabled.*/
 
SELECT constraint_name,
       table_name,
       status
FROM user_constraints
WHERE table_name LIKE 'RANDOM_%';
 

Activación de una Restricción.

Puede activar una restricción sin borrarla ni volverla a crear mediante la sentencia ALTER TABLE con la cláusula ENABLE


Sintaxis:

ALTER TABLE table
ENABLE CONSTRAINT constraint; 

Directrices:
Si activa una restricción, esa restricción se aplica a todos los datos de la tabla. Todos los datos de la tabla deben cumplir con la restricción.
•Si activa una restricción UNIQUE o PRIMARY KEY, se crea automáticamente un índice UNIQUE PRIMARY KEY. Si ya existe un índice, lo pueden utilizar estas claves. 
•Puede utilizar la cláusula ENABLE en las sentencias CREATE TABLE y ALTER TABLE.
•La activación de una restricción de clave primaria que se hubiese desactivado con la opción CASCADE no activa las claves ajenas que sean dependientes de la clave primaria. 
•Para activar una restricción UNIQUE PRIMARY KEY, debe disponer de los privilegios necesarios para crear un índice en la tabla.
 
Ejemplo:
ALTER TABLE random_table
ENABLE CONSTRAINT pk_col_id;
/*Ahora habilitamos nuestro CONSTRAINT: pk_col_id nuevamente, consulta la vista: user_constraints para que veas el status.*/
 
Restricciones en Cascada.
•La cláusula CASCADE CONSTRAINTS se utiliza junto con la cláusula DROP COLUMN
•La cláusula CASCADE CONSTRAINTS borra todas las restricciones de integridad referencial que hacen referencia a las claves única y primaria definidas en las columnas borradas.
•La cláusula CASCADE CONSTRAINTS también borra todas las restricciones de varias columnas definidas en las columnas borradas.
 
Ejemplos:
CREATE TABLE test1
(
  pk NUMBER PRIMARY KEY,
  fk NUMBER,
  col1 NUMBER,
  col2 NUMBER,
  CONSTRAINT fk_constraint FOREIGN KEY (fk) REFERENCES test1,
  CONSTRAINT  ck1 CHECK (pk > 0 and col1 > 0),
  CONSTRAINT ck2 CHECK (col2 > 0)
);
/*Estasentencia crea la tabla: test1, con la cual veremos el uso de la cláusulaCASCADECONSTRAINTS.*/
 
ALTER TABLE test1 DROP (pk);

ALTER TABLE test1 DROP (col1);
/*Recibimos error en estas dos ultimas sentencias ALTER, debido a que estas columnas comparten restricciones de otras columnas; pk es una clave principal; la restricción de varias columnas ck1 hace referencia a col1.*/

ALTER TABLE test1
DROP (col1) CASCADE CONSTRAINTS;
/*Al especificar CASCADE CONSTRAINTS, se elimina la columna y todas las restricciones asociadas a ella.*/
 
Visión General de Índices.
Se pueden crear dos tipos de índices. Un tipo es el índice único. Oracle Server crea automáticamente un índice único si se define una columna o un grupo de columnas en una tabla para tener una restricción PRIMARY KEY o UNIQUE. El nombre del índice es el nombre que se asigna a la restricción.
 
El otro tipo de índice es el no único y lo puede crear un usuario. Por ejemplo, puede crear un índice de columna FOREIGN KEY que se utilizará en uniones para mejorar la velocidad de recuperación.
 
Puede crear un índice en una o más columnas mediante la emisión de la sentencia CREATE INDEX.
 
También puede utilizar un índice existente para la columna PRIMARY KEY, por ejemplo cuando espera una carga grande de datos y desea acelerar la operación. Le conviene desactivar las restricciones durante la carga y activarlas después, en cuyo caso el hecho de tener un índice único en la clave primaria seguirá haciendo que se verifiquen los datos durante la carga. Así pues, puede crear primero un índice no único en la columna designada como PRIMARY KEY, crear a continuación la columna PRIMARY KEY y especificar que debería utilizar el índice existente. Los siguientes ejemplos ilustran el proceso:
 
--Paso 1: Creación de la Tabla
CREATE TABLE new_emp2
(  
  employee_id NUMBER(6),
  first_name  VARCHAR2(20),
  last_name   VARCHAR2(25)
 );
 
--Paso 2: Creación del Índice
CREATE INDEX emp_id_idx2 
  ON new_emp2(employee_id);
 
--Paso 3: Creación de la Clave Primaria
ALTER TABLE new_emp2 
ADD PRIMARY KEY (employee_id) USING INDEX emp_id_idx2;
 
Nota: Puede crear manualmente un índice único, pero se recomienda que cree una restricción única, lo que crea implícitamente un índice único.
 
Índices Basados en Funciones.
Los índices basados en funciones definidos con las palabras clave UPPER(column_name) o LOWER(column_name) permiten búsquedas no sensibles a mayúsculas/minúsculas. Por ejemplo, el siguiente índice: 
 
CREATE INDEX upper_last_name_idx
ON new_emp2 (UPPER(last_name));
 
facilita el procesamiento de consultas como: 
 
SELECT * 
FROM new_emp2
WHERE UPPER(last_name) = 'KING';
 
Oracle Server utiliza el índice únicamente si esa función en particular se utiliza en una consulta. Por ejemplo, la siguiente sentencia puede utilizar el índice, pero sin la cláusula WHERE Oracle Server puede realizar una exploración de tablas completas: 
 
SELECT *
FROM employees
WHERE UPPER(last_name) IS NOT NULL
ORDER BY UPPER(last_name);
 
Nota: Se debe definir el parámetro de inicialización QUERY_REWRITE_ENABLED en TRUE para que se utilice un índice basado en funciones. 
 
Oracle Server trata los índices con columnas marcadas como DESC como índices basados en funciones. Las columnas marcadas como DESC se clasifican en orden descendente.
Eliminación de un Índice.
Los índices no se pueden modificar. Para cambiar un índice, debe borrarlo y volverlo a crear. Para eliminar una definición de índice del diccionario de datos, emita la sentencia DROP INDEX. Para borrar un índice, debe ser el propietario del índice o tener el privilegio DROP ANY INDEX
 
Sintaxis:
DROP INDEX index;
 
Ejemplo:
DROP INDEX emp_id_idx2;
 
Nota: Si borra una tabla, los índices y las restricciones se borran automáticamente, pero las vistas y las secuencias permanecen.
DROP TABLE …PURGE.
La base de datos Oracle 10g presenta una nueva función para borrar tablas. Al borrar una tabla, la base de datos no libera inmediatamente el espacio asociado a la tabla. En su lugar, la base de datos cambia el nombre de la tabla y la coloca en una papelera de reciclaje, de donde se podrá recuperar después con la sentencia FLASHBACK TABLE si se da cuenta de que borró la tabla por error. Si desea liberar de forma inmediata el espacio asociado a la tabla en el momento de emitir la sentencia DROP TABLE, incluya la cláusula PURGE como se muestra en la sentencia de la diapositiva. 
 
Especifique PURGE sólo si desea borrar la tabla y liberar el espacio asociado a ella en un solo paso. Si especifica PURGE, la base de datos no coloca la tabla y sus objetos dependientes en la papelera de reciclaje. 
 
La utilización de esta cláusula es equivalente a borrar primero la tabla y purgarla después de la papelera de reciclaje. Esta cláusula le ahorra un paso en el proceso. Proporciona también una seguridad mejorada si desea evitar que aparezca material sensible en la papelera de reciclaje. 
 
Nota: No puede hacer rollback de una sentencia DROP TABLE con la cláusula PURGE, ni tampoco puede recuperar la tabla si la ha borrado con la cláusula PURGE. Esta función no estaba disponible en versiones anteriores a Oracle 10g.

Sentencia FLASHBACK TABLE
•Herramienta de reparación para modificaciones accidentales de tabla.
–Restaura una tabla a un punto anterior en el tiempo.
–Ventajas: Facilidad de uso, disponibilidad y ejecución rápida.
 
Utilidad de Reparación de Autoservicio.
 
La base de datos Oracle 10g proporciona un nuevo comando DDL de SQL, FLASHBACK TABLE, para restaurar el estado de una tabla a un punto anterior en el tiempo en el caso de que la haya suprimido o modificado de forma accidental. El comando FLASHBACK TABLE es una herramienta de reparación de autoservicio para restaurar datos de una tabla junto con los atributos asociados como, por ejemplo, índices o vistas. Esto se consigue cuando la base de datos está online haciendo rollback sólo de los cambios posteriores en la tabla en cuestión. Si se compara con mecanismos de recuperación tradicionales, esta función ofrece ventajas significativas, como la facilidad de uso, la disponibilidad y una recuperación más rápida. También libera al DBA del trabajo de encontrar y restaurar propiedades específicas de aplicación. La función de flashback en tabla no se ocupa de la corrupción física provocada por un disco en mal estado. 
 
Sintaxis:
FLASHBACK TABLE[schema.]table[, [ schema.]table ]...
TO { TIMESTAMP | SCN } expr
[ { ENABLE | DISABLE } TRIGGERS];
 
 
Puede llamar a una operación de flashback en una o más tablas, incluso en tablas de diferentes esquemas. Para especificar el punto en el tiempo al que desea revertir, proporcione un registro de hora válido. Por defecto, los disparadores de base de datos están desactivados para todas las tablas implicadas. Para sustituir este comportamiento por defecto, especifique la cláusula ENABLE TRIGGERS
 
Ejemplos:
CREATE TABLE emp_test
AS
  SELECT *
  FROM hr.employees;
/*Creamos la Tabla: emp_test, con la misma estructura y datos de la tabla employees de hr.*/
 
DROP TABLE emp_test;
/*Eliminamos la Tabla: emp_test.*/
 
SELECT
        original_name,
        operation,
        droptime
FROM recyclebin
WHERE original_name LIKE 'EMP_%';
/*Consultamos nuestra tabla en la papelería de reciclaje.*/
 
FLASHBACK TABLE emp_test TO BEFORE DROP;
/*El ejemplo restaura la tabla emp_test a un estado anterior a una sentencia DROP.*/
 
La papelera de reciclaje es en realidad una tabla de diccionario de datos que contiene información sobre objetos borrados. Las tablas borradas y los objetos asociados, como índices, restricciones, tablas anidadas, etc., no se eliminan y siguen ocupando espacio. Siguen ocupando las cuotas de espacio de usuario, hasta que se purgan específicamente de la papelera de reciclaje o hasta que se produce una situación poco probable en la que las deba purgar la base de datos debido a restricciones de espacio de Tablespace.
 
Se puede considerar a cada usuario propietario de una papelera de reciclaje, ya que, a menos que un usuario tenga el privilegio SYSDBA, los únicos objetos a los que puede acceder en la papelera de reciclaje son los de su propiedad. Un usuario puede ver sus objetos en la papelera de reciclaje mediante la siguiente sentencia:
 
SELECT *
FROM recyclebin;
 
Al borrar un usuario, los objetos que pertenecen a ese usuario no se colocarán en la papelera de reciclaje y se purgarán todos los objetos de la papelera de reciclaje.
 
Puede purgar la papelera de reciclaje con la siguiente sentencia: PURGE recyclebin;


Fuente: Base de Datos Oracle 10g: Conceptos Fundamentales de SQL 1
Read 275 times Last modified on Miércoles, 08 Julio 2020 17:48

Leave a comment

Make sure you enter all the required information, indicated by an asterisk (*). HTML code is not allowed.

Magic PL/SQL

Blog orientado al desarrollo de PL/SQL en el "Maravilloso Mundo ORACLE". Cursos Online y Tutoriales Gratis.