Truncate Table no Oracle é um comando útil. Ele é usado para excluir todas as linhas da tabela e liberar o espaço alocado para a tabela. Aqui estão alguns pontos importantes sobre a tabela Truncar
- Podemos usar truncar tabela comando para excluir todas as linhas da tabela e liberar todo o espaço de armazenamento alocado para a tabela. Ele redefine a marca d'água alta da tabela
- Este comando não pode ser revertido
- Você deve ser o proprietário da tabela para executar a operação
- Truncar a tabela é um comando DDL e não aciona os gatilhos de exclusão
- Também podemos excluir todas as linhas da tabela com o comando delete, mas isso não libera o espaço de armazenamento alocado para a tabela
- Quando você trunca uma tabela, o Oracle Database remove automaticamente todos os dados nos índices da tabela e qualquer informação de INSERT de caminho direto de visualização materializada mantida em associação com a tabela
Truncar a sintaxe da tabela no Oracle
Truncate table <table name> [CASCADE] [[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]] [[ DROP | REUSE]] STORAGE ];
-Onde
-Storage é descartado por padrão se ainda não for especificado. Se você deseja preservar o espaço, pode manter o armazenamento e, em seguida, reutilizá-lo
Se você estiver truncando a tabela de outro esquema, use assim
Truncate table <owner>.<table name>
Exemplos
Truncate table EMP; Truncate table SCOTT.EMP; Truncate table SCOTT.EMP reuse storage;
Como conceder tabela truncada no oracle
Não há privilégio de truncar tabela no Oracle. Você precisa fornecer o privilégio Drop any table para conceder truncate table no oracle. Soltar qualquer tabela vem com muitos outros privilégios. Portanto, isso pode não ser possível em todos os casos. Você pode superar esse desafio criando um procedimento e concedendo execução nesse procedimento. Vamos entender com o exemplo
Suponha que você queira dar uma tabela truncada de um usuário USER1 para outro usuário USER2
Se você tentar truncar a tabela simplesmente, você acertará o erro
conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges
Agora vamos tentar fazer isso através do procedimento e conceder privilégios nele
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');
Se você não quiser fazer isso, precisará conceder drop qualquer privilégio de tabela
conn system/<pass>
grant drop any table to user2;
Truncar a cascata de tabela
- Antes do Oracle 12c, você não pode truncar a tabela pai de uma restrição de chave estrangeira habilitada. Se você tentar, receberá ORA-02266 . Você deve desabilitar a restrição antes de truncar a tabela. Uma exceção é que você pode truncar a tabela se a restrição de integridade for auto-referencial.
- Com o Oracle 12c R1, a Oracle introduziu a cláusula Cascade para Truncar. Temos que especificar CASCADE permitindo que você trunque recursivamente as tabelas em uma hierarquia. Se você omitir esta cláusula e existirem tais restrições de integridade referencial, o banco de dados retornará um erro e não truncará a tabela. Vamos entender essa tabela truncada com cascata com um exemplo
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.
É importante observar que as restrições de chave estrangeira devem ter um ON DELETE CASCADE para que isso funcione. É um ponto importante observar que a tabela truncar com cascata não apenas exclui dados da tabela DEPT, mas também exclui a tabela EMP.
select * from DEPT; no rows Selected select * from EMP; no rows Selected
oracle truncar tabela vs excluir
Truncar | Excluir |
Excluir todas as linhas das tabelas | Pode ser usado para excluir uma ou mais linhas de uma tabela |
Comandos DDL e não dispara em gatilhos DELETE | Comando DML e disparando gatilhos de exclusão |
Reinicia a marca d'água na tabela | Não altera a marca d'água alta na tabela |
Não pode ser revertido | Pode ser revertido |
Mais rápido | mais lento |
Não é possível especificar onde a cláusula aqui | A cláusula Where pode ser especificada |
Você tem a opção de manter ou descartar o armazenamento alocado para o segmento | Não tem esta opção. O armazenamento permanece o mesmo |
Espero que este post seja útil para uma tabela truncada no oracle
Artigos relacionados
Oracle Criar tabela
verificar tamanho da tabela no Oracle
oracle mostrar todas as tabelas
Excluir de uma tabela no Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm