Oracle
 sql >> Database >  >> RDS >> Oracle

Come troncare la TABELLA in Oracle

Tronca tabella in Oracle è un comando utile. Viene utilizzato per eliminare tutte le righe della tabella più liberare lo spazio assegnato alla tabella. Ecco alcuni punti importanti riguardanti la tabella Tronca

  • Possiamo utilizzare tronca tabella comando per eliminare tutte le righe nella tabella e libera tutto lo spazio di archiviazione assegnato alla tabella. Azzera l'high water mark della tabella
  • Questo comando non può essere ripristinato
  • Dovresti essere il proprietario della tabella per eseguire l'operazione
  • Il troncamento della tabella è un comando DDL e non attiva i trigger di eliminazione
  • Possiamo eliminare tutte le righe della tabella anche tramite il comando delete, ma non libera lo spazio di archiviazione assegnato alla tabella
  • Quando si tronca una tabella, Oracle Database rimuove automaticamente tutti i dati negli indici della tabella e tutte le informazioni INSERT del percorso diretto della vista materializzata conservate in associazione con la tabella

Tronca la sintassi della tabella in Oracle

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

-Dove è il nome della tabella ed è necessario essere il proprietario della tabella o disporre dei privilegi di sistema Elimina qualsiasi TABLE per troncare una tabella
-La memoria viene eliminata per impostazione predefinita anche se non specificata. Se vuoi risparmiare spazio, puoi conservare lo spazio di archiviazione, quindi riutilizzarlo

Se stai troncando la tabella di un altro schema, usa in questo modo

Truncate table <owner>.<table name>

Esempi

Truncate table EMP;
Truncate table SCOTT.EMP;

Truncate table SCOTT.EMP reuse storage;

Come concedere tronca tabella in Oracle

Non esiste alcun privilegio tronca tabella in Oracle. È necessario fornire il privilegio Drop any table per concedere tronca la tabella in Oracle. Drop any table include molti altri privilegi. Quindi, questo potrebbe non essere possibile in tutti i casi. Puoi superare questa sfida creando una procedura e concedendo l'esecuzione su quella procedura. Capiamo con l'esempio

Si supponga di voler assegnare una tabella troncata di un utente USER1 a un altro utente USER2

Se provi a troncare semplicemente la tabella, visualizzerai l'Errore

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

Ora proviamo a fare questa cosa attraverso la procedura e concedendo il privilegio su di essa

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 non vuoi fare questa cosa, dovrai concedere il privilegio drop any table

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

Tronca una cascata di tabelle

  • Prima di Oracle 12c, non è possibile troncare la tabella padre di un vincolo di chiave esterna abilitato. Se lo provi, otterrai ORA-02266 . È necessario disabilitare il vincolo prima di troncare la tabella. Un'eccezione è che puoi troncare la tabella se il vincolo di integrità è autoreferenziale.
  • Con Oracle 12c R1, Oracle ha introdotto la clausola Cascade per Truncate. È necessario specificare CASCADE che consente di troncare ricorsivamente le tabelle in una gerarchia Se si omette questa clausola e esistono tali vincoli di integrità referenziale, il database restituisce un errore e non tronca la tabella. Capiamo questa tabella troncata con cascata con un esempio
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 notare che i vincoli di chiave esterna dovrebbero avere un ON DELETE CASCADE affinché funzioni. È importante notare che la tabella troncata con cascata non solo elimina i dati dalla tabella DEPT ma elimina anche la tabella EMP.

select * from DEPT;
no rows Selected

select * from EMP;
no rows Selected

oracle tronca tabella vs eliminazione

Tronca Elimina
Cancella tutte le righe dalle tabelle Può essere utilizzato per eliminare una o più righe da una tabella
Comandi DDL e non si attiva sui trigger DELETE Comando DML e attiva ON Elimina trigger
Reimposta il contrassegno Highwater nella tabella Non cambia l'high water mark nella tabella
Non può essere ripristinato Può essere ripristinato
Più veloce più lento
Impossibile specificare dove si trova la clausola qui Dove è possibile specificare la clausola
Hai la possibilità di mantenere o eliminare lo spazio di archiviazione assegnato al segmento Non ha questa opzione. Lo spazio di archiviazione rimane lo stesso

Spero che questo post sia utile per una tabella troncata in Oracle

Articoli correlati

Oracle Crea tabella
controlla le dimensioni della tabella in Oracle
oracle mostra tutte le tabelle
Elimina da una tabella in Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/dichiarazioni_10007.htm