Obcięcie tabeli w Oracle to przydatne polecenie. Służy do usunięcia wszystkich wierszy w tabeli oraz zwolnienia miejsca przydzielonego do tabeli. Oto kilka ważnych punktów dotyczących tabeli Obcinanie
- Możemy użyć tabeli przycinania polecenie, aby usunąć wszystkie wiersze w tabeli i zwalnia całą przestrzeń dyskową przydzieloną do tabeli. Resetuje wysoki poziom wody na stole
- To polecenie nie może zostać wycofane
- Powinieneś być właścicielem tabeli, aby wykonać operację
- Obcinanie tabeli jest poleceniem DDL i nie uruchamia wyzwalaczy przy usuwaniu
- Możemy również usunąć wszystkie wiersze w tabeli za pomocą polecenia usuwania, ale nie zwalnia to miejsca przydzielonego do tabeli
- Kiedy obcinasz tabelę, baza danych Oracle automatycznie usuwa wszystkie dane z indeksów tabeli i wszelkie informacje o bezpośredniej ścieżce widoku zmaterializowanego INSERT przechowywane w związku z tabelą
Obetnij składnię tabeli w Oracle
Truncate table <table name> [CASCADE] [[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]] [[ DROP | REUSE]] STORAGE ];
-Gdzie
-Pamięć jest domyślnie usuwana, jeśli nawet nie została określona. Jeśli chcesz zaoszczędzić miejsce, możesz je zachować, a następnie wykorzystać ponownie
Jeśli obcinasz tabelę innego schematu, użyj tego
Truncate table <owner>.<table name>
Przykłady
Truncate table EMP; Truncate table SCOTT.EMP; Truncate table SCOTT.EMP reuse storage;
Jak przyznać obcięcie tabeli w Oracle
W Oracle nie ma uprawnień do obcinania tabeli. Musisz przyznać uprawnienie Upuść dowolny stół, aby przyznać funkcję obcinania tabeli w Oracle. Upuść dowolny stół ma wiele innych przywilejów. Tak więc może to nie być możliwe we wszystkich przypadkach. Możesz przezwyciężyć to wyzwanie, tworząc procedurę i zezwalając na wykonanie tej procedury. Zrozummy na przykładzie
Załóżmy, że chcesz przekazać tabelę okrojoną jednego użytkownika USER1 innemu użytkownikowi USER2
Jeśli spróbujesz po prostu obciąć tabelę, natkniesz się na błąd
conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges
Teraz spróbujmy to zrobić za pomocą procedury i nadając jej uprawnienia
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');
Jeśli nie chcesz tego robić, musisz przyznać uprawnienia do usuwania dowolnego stołu
conn system/<pass>
grant drop any table to user2;
Obetnij kaskadę tabeli
- Przed Oracle 12c nie można obcinać tabeli nadrzędnej włączonego ograniczenia klucza obcego. Jeśli spróbujesz, otrzymasz ORA-02266 . Musisz wyłączyć ograniczenie przed obcięciem tabeli. Wyjątkiem jest to, że możesz obciąć tabelę, jeśli ograniczenie integralności jest samoodnośne.
- W Oracle 12c R1 firma Oracle wprowadziła klauzulę Cascade dla funkcji Truncate. Musimy określić KASKADĘ umożliwiającą rekursywne obcinanie tabel w hierarchii. Jeśli pominiesz tę klauzulę, a takie ograniczenia integralności referencyjnej istnieją, baza danych zwróci błąd i nie będzie obcinać tabeli. Zrozummy tę obcinaną tabelę z kaskadą na przykładzie
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.
Ważne jest, aby pamiętać, że aby to zadziałało, ograniczenia klucza obcego powinny mieć opcję ON DELETE CASCADE. Ważne jest, aby pamiętać, że obcięcie tabeli z kaskadą nie tylko usuwa dane tylko z tabeli DEPT, ale także usuwa tabelę EMP.
select * from DEPT; no rows Selected select * from EMP; no rows Selected
Oracle obcinanie tabeli vs usuwanie
Obetnij | Usuń |
Usuń wszystkie wiersze z tabel | Może być użyty do usunięcia jednego lub więcej wierszy z tabeli |
Polecenia DDL i nie uruchamiają wyzwalaczy On DELETE | Polecenie DML i uruchamianie ON Usuń wyzwalacze |
Resetuje znacznik Highwater w tabeli | Nie zmienia znaku wysokiego poziomu wody w tabeli |
Nie można cofnąć | Może być cofnięty |
Szybciej | wolniej |
Nie można określić, gdzie klauzula tutaj | Gdzie można określić klauzulę |
Masz możliwość zachowania lub usunięcia pamięci przydzielonej do segmentu | Nie ma tej opcji. Pamięć pozostaje taka sama |
Mam nadzieję, że ten post jest pomocny przy obcinaniu tabeli w Oracle
Powiązane artykuły
Oracle Utwórz tabelę
sprawdź rozmiar tabeli w Oracle
oracle pokaż wszystkie tabele
Usuń z tabeli w Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm