Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment tronquer TABLE dans Oracle

Truncate Table dans Oracle est une commande utile. Il est utilisé pour supprimer toutes les lignes de la table et libérer l'espace alloué à la table. Voici quelques points importants concernant la table Truncate

  • Nous pouvons utiliser tronquer la table pour supprimer toutes les lignes de la table et libérer tout l'espace de stockage alloué à la table. Il réinitialise la marque d'eau haute de la table
  • Cette commande ne peut pas être annulée
  • Vous devez être propriétaire de la table pour exécuter l'opération
  • Tronquer la table est une commande DDL et elle ne déclenche pas les déclencheurs de suppression
  • Nous pouvons également supprimer toutes les lignes de la table à l'aide de la commande de suppression, mais cela ne libère pas l'espace de stockage alloué à la table
  • Lorsque vous tronquez une table, Oracle Database supprime automatiquement toutes les données des index de la table et toutes les informations INSERT de chemin direct de vue matérialisée détenues en association avec la table

Syntaxe de table tronquée dans Oracle

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

-Où est le nom de la table et vous devez être le propriétaire de la table ou disposer des privilèges système Drop any TABLE pour tronquer une table
-Le stockage est supprimé par défaut s'il n'est même pas spécifié. Si vous souhaitez conserver de l'espace, vous pouvez conserver l'espace de stockage, puis le réutiliser

Si vous tronquez la table d'un autre schéma, utilisez comme ceci

Truncate table <owner>.<table name>

Exemples

Truncate table EMP;
Truncate table SCOTT.EMP;

Truncate table SCOTT.EMP reuse storage;

Comment accorder une table tronquée dans Oracle

Il n'y a pas de privilège de table tronquée dans Oracle. Vous devez fournir le privilège Supprimer n'importe quelle table pour accorder la table tronquée dans Oracle. Drop n'importe quelle table est livré avec de nombreux autres privilèges. Donc, cela peut ne pas être possible dans tous les cas. Vous pouvez surmonter ce défi en créant une procédure et en accordant l'exécution de cette procédure. Comprenons avec l'exemple

Supposons que vous vouliez donner une table tronquée d'un utilisateur USER1 à un autre utilisateur USER2

Si vous essayez de tronquer simplement le tableau, vous tomberez sur l'erreur

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

Essayons maintenant de faire cette chose à travers la procédure et d'accorder des privilèges dessus

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 vous ne voulez pas faire cela, vous devrez alors accorder le privilège drop any table

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

Tronquer le tableau en cascade

  • Avant Oracle 12c, vous ne pouvez pas tronquer la table parent d'une contrainte de clé étrangère activée. Si vous l'essayez, vous obtiendrez ORA-02266 . Vous devez désactiver la contrainte avant de tronquer la table. Une exception est que vous pouvez tronquer le tableau si la contrainte d'intégrité est auto-référentielle.
  • Avec Oracle 12c R1, Oracle a introduit la clause Cascade pour Truncate. Nous devons spécifier CASCADE vous permettant de tronquer récursivement les tables dans une hiérarchie. Si vous omettez cette clause et que de telles contraintes d'intégrité référentielle existent, la base de données renvoie une erreur et ne tronque pas la table. Comprenons ce tableau tronqué avec cascade avec un exemple
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.

Il est important de noter que les contraintes de clé étrangère doivent avoir une ON DELETE CASCADE pour que cela fonctionne. Il est important de noter que la table tronquée avec cascade supprime non seulement les données de la table DEPT, mais supprime également la table EMP.

select * from DEPT;
no rows Selected

select * from EMP;
no rows Selected

oracle tronquer la table vs supprimer

Tronquer Supprimer
Supprimer toutes les lignes des tables Il peut être utilisé pour supprimer une ou plusieurs lignes d'un tableau
Commandes DDL et ne se déclenche pas sur les déclencheurs DELETE Commande DML et déclenche les déclencheurs de suppression
Il réinitialise la marque Highwater dans le tableau Cela ne change pas la ligne des hautes eaux dans le tableau
Impossible de revenir en arrière Peut être restauré
Plus rapide plus lent
Impossible de spécifier où la clause ici La clause Where peut être spécifiée
Vous avez la possibilité de conserver ou de supprimer l'espace de stockage alloué au segment Il n'a pas cette option. Le stockage reste le même

J'espère que ce message est utile pour une table tronquée dans Oracle

Articles connexes

Oracle Créer une table
vérifier la taille de la table dans Oracle
oracle afficher toutes les tables
Supprimer d'une table dans Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm