Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como truncar TABLE no Oracle


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 é o nome da tabela e você deve ser o proprietário da tabela ou ter privilégios de sistema Drop any TABLE para truncar uma tabela
-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