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ù
-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