sql >> Database >  >> RDS >> Oracle

Hoe TABLE af te kappen in Oracle

Truncate Table in Oracle is een handig commando. Het wordt gebruikt om alle rijen in de tabel te verwijderen en de aan de tabel toegewezen ruimte vrij te geven. Hier zijn enkele belangrijke punten met betrekking tot de Truncate-tabel

  • We kunnen tabel afkappen . gebruiken opdracht om alle rijen in de tabel te verwijderen en alle aan de tabel toegewezen opslagruimte vrij te geven. Het reset het hoogwaterteken van de tafel
  • Deze opdracht kan niet worden teruggedraaid
  • U moet de eigenaar van de tabel zijn om de bewerking uit te voeren
  • Het afkappen van de tabel is een DDL-commando en het activeert de triggers bij verwijderen niet
  • We kunnen alle rijen in de tabel ook verwijderen met de delete-opdracht, maar de opslagruimte die aan de tabel is toegewezen, wordt niet vrijgegeven
  • Wanneer u een tabel afkapt, verwijdert Oracle Database automatisch alle gegevens in de indexen van de tabel en alle gematerialiseerde INSERT-informatie over het directe pad die bij de tabel wordt bewaard

Truncate-tabelsyntaxis in Oracle

Truncate table <table name>
[CASCADE]
[[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]]
[[ DROP | REUSE]] STORAGE ];

-Waarbij de naam van de tabel is en u de eigenaar van de tabel moet zijn of TABLE-systeemprivileges moet hebben om een ​​tabel af te kappen
-Opslag wordt standaard verwijderd als dit zelfs niet is opgegeven. Als u ruimte wilt besparen, kunt u opslagruimte behouden en vervolgens opslagruimte hergebruiken

Als je de tabel van een ander schema afkapt, gebruik het dan als volgt

Truncate table <owner>.<table name>

Voorbeelden

Truncate table EMP;
Truncate table SCOTT.EMP;

Truncate table SCOTT.EMP reuse storage;

Hoe een truncate-tabel in orakel toe te kennen

Er is geen bevoegdheid voor het afkappen van tabellen in Oracle. U moet elk tabelrecht laten vallen om tabel in orakel af te kappen. Elke tafel laten vallen heeft vele andere privileges. Dit is dus niet in alle gevallen mogelijk. U kunt deze uitdaging overwinnen door een procedure te maken en die procedure uit te voeren. Laten we het met het voorbeeld begrijpen

Stel dat u een afgekapte tabel van een gebruiker USER1 wilt geven aan een andere gebruiker USER2

Als u de tabel eenvoudig probeert af te kappen, krijgt u de Error

conn user2/pass
truncate table user1.EMP
*
ERROR at line 1:
ORA-01031: insufficient privileges

Laten we nu proberen dit te doen door middel van de procedure en het verlenen van privileges

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');

Als je dit niet wilt doen, moet je tafelrechten laten vallen

conn system/<pass>
grant drop any table to user2;

Truncate Table Cascade

  • Vóór Oracle 12c kunt u de bovenliggende tabel van een ingeschakelde externe-sleutelbeperking niet afkappen. Als je het probeert, krijg je ORA-02266 . U moet de beperking uitschakelen voordat u de tabel afkapt. Een uitzondering is dat u de tabel kunt afkappen als de integriteitsbeperking naar zichzelf verwijst.
  • Met Oracle 12c R1 heeft Oracle een Cascade-clausule voor Truncate geïntroduceerd. We moeten CASCADE specificeren zodat u de tabellen in een hiërarchie recursief kunt afkappen. Als u deze clausule weglaat en dergelijke referentiële integriteitsbeperkingen bestaan, retourneert de database een fout en wordt de tabel niet afgekapt. Laten we deze afgekapte tabel met cascade begrijpen met een voorbeeld
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.

Het is belangrijk op te merken dat externe sleutelbeperkingen een ON DELETE CASCADE moeten hebben om dit te laten werken. Het is een belangrijk punt om op te merken dat de afkaptabel met cascade niet alleen gegevens uit de DEPT-tabel verwijdert, maar ook de EMP-tabel verwijdert.

select * from DEPT;
no rows Selected

select * from EMP;
no rows Selected

orakel tabel afkappen vs verwijderen

Truncate Verwijderen
Verwijder alle rijen uit de tabellen Het kan worden gebruikt om een ​​of meer rijen uit een tabel te verwijderen
DDL-commando's en wordt niet geactiveerd bij DELETE-triggers DML Commando en vuur AAN Verwijder triggers
Het zet de Highwater-markering in de tabel terug Het verandert niets aan het hoogwaterteken in de tabel
Kan niet worden teruggedraaid Kan teruggedraaid worden
Sneller langzamer
Kan hier niet specificeren waar de clausule Waar clausule kan worden opgegeven
Je hebt de mogelijkheid om de aan het segment toegewezen opslagruimte te behouden of te verwijderen Het heeft deze optie niet. Opslag blijft hetzelfde

Hoop Dit bericht is nuttig voor een afkaptabel in orakel

Gerelateerde artikelen

Oracle Tabel maken
controleer de tabelgrootte in Oracle
oracle toon alle tabellen
Verwijderen uit een tabel in Oracle
https://docs.oracle.com/cd/B28359_01/server. 111/b28286/statements_10007.htm


  1. Wat zijn de voordelen van een datamanagementsysteem?

  2. PRAGMA table_list in SQLite

  3. Meerdere PostgreSQL-servers installeren op RedHat Linux

  4. Rijpatroonherkenning in SQL