Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak przyciąć TABLE w Oracle

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 jest nazwą tabeli i musisz być właścicielem tabeli lub musisz mieć uprawnienia systemowe Usuń jakiekolwiek uprawnienia systemowe TABLE, aby obciąć tabelę
-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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Formatowanie DATE w Oracle

  2. Uzyskaj listę wszystkich funkcji i procedur w bazie danych Oracle

  3. Jak wyświetlić wszystkie tabele w Oracle?

  4. Z procedury składowanej zwróć parametr OUT i kursor OUT i wynik analizy (Oracle)

  5. oracle — Podziel wiele wartości oddzielonych przecinkami w tabeli Oracle na wiele wierszy