Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So kürzen Sie TABLE in Oracle

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 Name der Tabelle ist und Sie der Eigentümer der Tabelle sein müssen oder alle TABLE-Systemrechte löschen müssen, um eine Tabelle zu kürzen
- 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ßen
conn 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