Truncate Table in Oracle ist ein nützlicher Befehl. Es wird verwendet, um alle Zeilen in der Tabelle zu löschen und den der Tabelle zugewiesenen Speicherplatz freizugeben. Hier sind einige wichtige Punkte bezüglich der Truncate-Tabelle
- Wir können truncate table verwenden Befehl zum Löschen aller Zeilen in der Tabelle und gibt den gesamten Speicherplatz frei, der der Tabelle zugewiesen ist. Es setzt die High Water Mark der Tabelle zurück
- Dieser Befehl kann nicht zurückgesetzt werden
- Sie sollten Eigentümer der Tabelle sein, um die Operation auszuführen
- Das Abschneiden der Tabelle ist ein DDL-Befehl und löst keine On-Delete-Trigger aus
- Wir können auch alle Zeilen in der Tabelle mit dem Löschbefehl löschen, aber es gibt nicht den der Tabelle zugewiesenen Speicherplatz frei
- Wenn Sie eine Tabelle kürzen, entfernt Oracle Database automatisch alle Daten in den Indizes der Tabelle und alle Materialized View Direct-Path-INSERT-Informationen, die in Verbindung mit der Tabelle gespeichert sind
Tabellensyntax in Oracle abschneiden
Truncate table <table name> [CASCADE] [[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]] [[ DROP | REUSE]] STORAGE ];
- Wobei
- Der Speicher wird standardmäßig gelöscht, wenn er nicht angegeben ist. Wenn Sie Platz sparen möchten, können Sie Speicherplatz behalten und dann wiederverwenden
Wenn Sie die Tabelle eines anderen Schemas abschneiden, verwenden Sie wie folgt
Truncate table <owner>.<table name>
Beispiele
Truncate table EMP; Truncate table SCOTT.EMP; Truncate table SCOTT.EMP reuse storage;
Wie man in Orakel eine Truncate-Tabelle gewährt
In Oracle gibt es keine Berechtigung zum Abschneiden von Tabellen. Sie müssen die Berechtigung zum Löschen einer beliebigen Tabelle bereitstellen, um das Abschneiden der Tabelle in Oracle zu gewähren. Das Löschen einer beliebigen Tabelle ist mit vielen anderen Privilegien verbunden. Dies ist also möglicherweise nicht in allen Fällen möglich. Sie können diese Herausforderung überwinden, indem Sie eine Prozedur erstellen und die Ausführung für diese Prozedur gewähren. Lassen Sie uns das anhand des Beispiels verstehen
Angenommen, Sie möchten eine Kürzungstabelle eines Benutzers USER1 einem anderen Benutzer USER2 geben
Wenn Sie versuchen, die Tabelle einfach abzuschneiden, werden Sie auf den Fehler
stoßenconn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges
Lassen Sie uns nun versuchen, dies durch die Prozedur und das Gewähren von Berechtigungen zu tun
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');
Wenn Sie dies nicht tun möchten, müssen Sie die Berechtigung zum Löschen beliebiger Tabellen erteilen
conn system/<pass>
grant drop any table to user2;
Tabellenkaskade abschneiden
- Vor Oracle 12c konnten Sie die übergeordnete Tabelle einer aktivierten Fremdschlüsseleinschränkung nicht abschneiden. Wenn Sie es versuchen, erhalten Sie ORA-02266 . Sie müssen die Einschränkung deaktivieren, bevor Sie die Tabelle abschneiden. Eine Ausnahme ist, dass Sie die Tabelle kürzen können, wenn die Integritätsbedingung selbstreferenziell ist.
- Mit Oracle 12c R1 hat Oracle die Cascade-Klausel für Truncate eingeführt. Wir müssen CASCADE angeben, damit Sie die Tabellen in einer Hierarchie rekursiv abschneiden können. Wenn Sie diese Klausel weglassen und solche referenziellen Integritätsbedingungen vorhanden sind, gibt die Datenbank einen Fehler zurück und schneidet die Tabelle nicht ab. Lassen Sie uns diese Truncate-Tabelle mit Kaskade anhand eines Beispiels verstehen
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.
Es ist wichtig zu beachten, dass Foreign Key Constraints eine ON DELETE CASCADE haben sollten, damit dies funktioniert. Es ist ein wichtiger Punkt zu beachten, dass das Abschneiden der Tabelle mit Kaskade nicht nur Daten aus der DEPT-Tabelle löscht, sondern auch die EMP-Tabelle.
select * from DEPT; no rows Selected select * from EMP; no rows Selected
Oracle-Tabelle abschneiden vs. löschen
Abschneiden | Löschen |
Löschen Sie alle Zeilen aus den Tabellen | Es kann verwendet werden, um eine oder mehrere Zeilen aus einer Tabelle zu löschen |
DDL-Befehle und wird bei DELETE-Triggern nicht ausgelöst | DML-Befehl und Auslösen von ON Delete-Triggern |
Er setzt die Highwater-Marke in der Tabelle zurück | Die High Water Mark in der Tabelle wird dadurch nicht verändert |
Kann nicht zurückgesetzt werden | Kann rückgängig gemacht werden |
Schneller | langsamer |
Kann hier nicht angeben, wo die Klausel steht | Wo-Klausel angegeben werden kann |
Sie haben die Möglichkeit, den dem Segment zugewiesenen Speicher beizubehalten oder zu löschen | Diese Option ist nicht vorhanden. Speicher bleibt gleich |
Hope Dieser Beitrag ist hilfreich für eine Truncate-Tabelle in Oracle
Verwandte Artikel
Oracle Tabelle erstellen
Tabellengröße in Oracle überprüfen
Oracle alle Tabellen anzeigen
Aus einer Tabelle in Oracle löschen
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm