sql >> Base de Datos >  >> RDS >> Oracle

Cómo truncar TABLE en Oracle

Truncar tabla en Oracle es un comando útil. Se utiliza para eliminar todas las filas de la tabla y liberar el espacio asignado a la tabla. Estos son algunos puntos importantes con respecto a la tabla Truncar

  • Podemos usar tabla truncada comando para eliminar todas las filas de la tabla y libera todo el espacio de almacenamiento asignado a la tabla. Restablece la marca de agua alta de la tabla
  • Este comando no se puede deshacer
  • Debe ser propietario de la tabla para ejecutar la operación
  • Truncar la tabla es un comando DDL y no activa los activadores de eliminación
  • También podemos eliminar todas las filas de la tabla mediante el comando de eliminación, pero no libera el espacio de almacenamiento asignado a la tabla
  • Cuando trunca una tabla, Oracle Database elimina automáticamente todos los datos en los índices de la tabla y cualquier información de INSERCIÓN de ruta directa de vista materializada que se mantenga en asociación con la tabla

Sintaxis de tabla truncada en Oracle

Truncate table <table name>
[CASCADE]
[[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]]
[[ DROP | REUSE]] STORAGE ];

-Donde es el nombre de la tabla y debe ser el propietario de la tabla o tener privilegios del sistema Eliminar cualquier TABLA para truncar una tabla
-El almacenamiento se elimina de forma predeterminada si no se especifica. Si desea conservar el espacio, puede mantener el almacenamiento y luego reutilizar el almacenamiento

Si está truncando la tabla de otro esquema, use así

Truncate table <owner>.<table name>

Ejemplos

Truncate table EMP;
Truncate table SCOTT.EMP;

Truncate table SCOTT.EMP reuse storage;

Cómo otorgar una tabla truncada en Oracle

No hay privilegio de tabla truncada en Oracle. Debe proporcionar el privilegio Eliminar cualquier tabla para otorgar la tabla truncada en Oracle. Drop any table viene con muchos otros privilegios. Por lo tanto, esto puede no ser posible en todos los casos. Puede superar este desafío creando un procedimiento y otorgando la ejecución en ese procedimiento. Entendamos con el ejemplo

Suponga que desea dar una tabla truncada de un usuario USUARIO1 a otro usuario USUARIO2

Si intenta truncar la tabla simplemente, obtendrá el Error

conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges

Ahora intentemos hacer esto a través del procedimiento y otorgándole privilegios

Conn user1/pass

create or replace procedure trunc_t( p_table in VARCHAR2)
is
v_count pls_integer;
BEGIN
select count(*) into v_count
from user_tables
where
table_name = p_table;
if ( v_count = 1 )
then
execute immediate 'truncate table '|| p_table;
else
raise_application_error( -20001,
'table does not exists' );
end if;
END;
/

grant execute on trunc_t to user2;

Conn user2/pass
exec trunc_t('EMP');

Si no desea hacer esto, deberá otorgar el privilegio de eliminar cualquier tabla

conn system/<pass>
grant drop any table to user2;

Truncar tabla en cascada

  • Antes de Oracle 12c, no puede truncar la tabla principal de una restricción de clave externa habilitada. Si lo pruebas, obtendrás ORA-02266 . Debe deshabilitar la restricción antes de truncar la tabla. Una excepción es que puede truncar la tabla si la restricción de integridad es autorreferencial.
  • Con Oracle 12c R1, Oracle ha introducido la cláusula Cascade para Truncate. Tenemos que especificar CASCADE, lo que le permite truncar recursivamente las tablas en una jerarquía. Si omite esta cláusula y existen tales restricciones de integridad referencial, la base de datos devuelve un error y no trunca la tabla. Entendamos esta tabla truncada con cascada con un ejemplo
CREATE TABLE "EMP"
( "EMPNO" NUMBER(6,0),
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0),
CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO"),
CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
REFERENCES "DEPT" ("DEPTNO") ON DELETE CASCADE ENABLE
);
CREATE TABLE "DEPT"
( "DEPTNO" NUMBER(2,0),
"DNAME" VARCHAR2(14),
"LOC" VARCHAR2(13),
CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
;
SQL> desc emp
Name Null? Type
----------------------------------------- -------- -----------------------
EMPNO NOT NULL NUMBER(6)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)SQL>
SQL> desc dept
Name Null? Type
----------------------------------------- -------- -----------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL>
insert into DEPT values(10, 'ACCOUNTING', 'NEW YORK');
insert into dept values(20, 'RESEARCH', 'DALLAS');
insert into dept values(30, 'RESEARCH', 'DELHI');
insert into dept values(40, 'RESEARCH', 'MUMBAI');
insert into emp values( 7698, 'BLAKE', 'MANAGER', 7839, to_date('1-5-2007','dd-mm-yyyy'), 2850, null, 10 );
insert into emp values( 7782, 'CLARK', 'MANAGER', 7839, to_date('9-6-2008','dd-mm-yyyy'), 2450, null, 10 );
insert into emp values( 7788, 'SCOTT', 'ANALYST', 7566, to_date('9-6-2012','dd-mm-yyyy'), 3000, null, 20 );
insert into emp values( 7789, 'TPM', 'ANALYST', 7566, to_date('9-6-2017','dd-mm-yyyy'), 3000, null, null );
insert into emp values( 7560, 'T1OM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, 20 );
insert into emp values( 7790, 'TOM', 'ANALYST', 7567, to_date('9-7-2017','dd-mm-yyyy'), 4000, null, null );
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 01-MAY-07 2850 10
7782 CLARK MANAGER 7839 09-JUN-08 2450 10
7788 SCOTT ANALYST 7566 09-JUN-12 3000 20
7789 TPM ANALYST 7566 09-JUN-17 3000
7790 TOM ANALYST 7567 09-JUL-17 4000
4534 xyz 1000 20
4576 abc 1000
7560 T1OM ANALYST 7567 09-JUL-17 4000 20
SQL> truncate table dept;
truncate table dept
*
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by foreign keys
SQL>
SQL> truncate table dept cascade;
Table truncated.

Es importante tener en cuenta que las restricciones de clave externa deben tener ON DELETE CASCADE para que esto funcione. Es un punto importante tener en cuenta que la tabla truncada con cascada no solo elimina los datos de la tabla DEPT, sino que también elimina la tabla EMP.

select * from DEPT;
no rows Selected

select * from EMP;
no rows Selected

tabla truncada de Oracle vs eliminar

Truncar Eliminar
Eliminar todas las filas de las tablas Se puede usar para eliminar una o más filas de una tabla
Comandos DDL y no se activan en activadores DELETE Comando DML y activa ON Delete triggers
Restablece la marca de Highwater en la tabla No cambia la marca de agua alta en la tabla
No se puede revertir Se puede revertir
Más rápido más lento
No se puede especificar dónde está la cláusula aquí Donde se puede especificar la cláusula
Tiene la opción de mantener o descartar el almacenamiento asignado al segmento No tiene esta opción. El almacenamiento sigue siendo el mismo

Espero que esta publicación sea útil para una tabla truncada en Oracle

Artículos relacionados

Oracle Crear tabla
comprobar el tamaño de la tabla en Oracle
Oracle mostrar todas las tablas
Eliminar de una tabla en Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/declaraciones_10007.htm