sql >> データベース >  >> RDS >> Oracle

OracleでTABLEを切り捨てる方法

    Oracleのテーブルの切り捨ては便利なコマンドです。これは、テーブル内のすべての行を削除し、テーブルに割り当てられたスペースを解放するために使用されます。切り捨てテーブルに関するいくつかの重要なポイントは次のとおりです

    • テーブルの切り捨てを使用できます テーブル内のすべての行を削除するコマンドを実行すると、テーブルに割り当てられているすべてのストレージスペースが解放されます。テーブルの最高水準点をリセットします
    • このコマンドをロールバックすることはできません
    • 操作を実行するには、テーブルの所有者である必要があります
    • テーブルの切り捨てはDDLコマンドであり、ondeleteトリガーは発生しません
    • deleteコマンドを使用してテーブル内のすべての行を削除することもできますが、テーブルに割り当てられたストレージスペースは解放されません
    • 表を切り捨てると、Oracle Databaseは、表の索引内のすべてのデータと、表に関連付けられているマテリアライズド・ビューのダイレクト・パスINSERT情報を自動的に削除します。

    Oracleでのテーブル構文の切り捨て

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

    -

    はテーブルの名前であり、テーブルの所有者であるか、テーブルを切り捨てるためにTABLEシステム権限をドロップする必要があります
    -ストレージは、指定されていない場合でもデフォルトでドロップされます。スペースを節約したい場合は、ストレージを保持してから、ストレージを再利用できます

    別のスキーマのテーブルを切り捨てる場合は、次のように使用します

    Truncate table <owner>.<table name>
    を切り捨てます

    Truncate table EMP;
    Truncate table SCOTT.EMP;
    
    Truncate table SCOTT.EMP reuse storage;

    Oracleでテーブルの切り捨てを許可する方法

    Oracleにはテーブルの切り捨て特権はありません。 Oracleでテーブルの切り捨てを許可するには、テーブルの削除権限を提供する必要があります。テーブルをドロップすると、他の多くの特権が付属します。したがって、これはすべての場合に可能であるとは限りません。プロシージャを作成し、そのプロシージャの実行を許可することで、この課題を克服できます。例で理解しましょう

    あるユーザーUSER1の切り捨てテーブルを別のユーザーUSER2に渡したいとします

    テーブルを単純に切り捨てようとすると、エラーが発生します

    conn user2/pass
    truncate table user1.EMP
    *
    ERROR at line 1:
    ORA-01031: insufficient 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');
    に実行を許可します。

    このようなことをしたくない場合は、テーブルの削除権限を付与する必要があります

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

    テーブルカスケードの切り捨て

    • Oracle 12cより前では、有効な外部キー制約の親テーブルを切り捨てることはできません。試してみると、 ORA-02266 。テーブルを切り捨てる前に、制約を無効にする必要があります。例外は、整合性制約が自己参照である場合にテーブルを切り捨てることができることです。
    • Oracle 12c R1では、OracleはTruncateにCascade句を導入しました。 CASCADEを指定して、階層内のテーブルを再帰的に切り捨てることができるようにする必要があります。この句を省略し、そのような参照整合性制約が存在する場合、データベースはエラーを返し、テーブルを切り捨てません。例を使用して、この切り捨てられたテーブルをカスケードで理解しましょう
    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.

    これが機能するには、外部キー制約にONDELETECASCADEが必要であることに注意することが重要です。カスケードを使用したテーブルの切り捨ては、DEPTテーブルからデータを削除するだけでなく、EMPテーブルも削除することに注意することが重要です。

    select * from DEPT;
    no rows Selected
    
    select * from EMP;
    no rows Selected
    

    oracle truncate table vs delete

    切り捨て 削除
    テーブルからすべての行を削除します テーブルから1つ以上の行を削除するために使用できます
    DDLコマンドであり、DELETEトリガーでは起動しません DMLコマンドとFireONDeleteトリガー
    テーブルの最高水準点をリセットします テーブルの最高水準点は変更されません
    ロールバックできません ロールバックできます
    より高速 遅い
    ここで句を指定することはできません Where句を指定できます
    セグメントに割り当てられたストレージを保持または削除するオプションがあります このオプションはありません。ストレージは同じままです

    この投稿がOracleのテーブルの切り捨てに役立つことを願っています

    関連記事

    Oracleテーブルの作成
    Oracleのテーブルサイズの確認
    oracleすべてのテーブルの表示
    Oracleのテーブルからの削除
    https://docs.oracle.com/cd/B28359_01/server。 111 / b28286 / statement_10007.htm


    1. 重複エントリのエラーを処理するにはどうすればよいですか?

    2. PostgreSQLでデフォルトのユーザーパスワードを設定する方法

    3. SQL Server(T-SQL)でTIMEデータ型をフォーマットするときはこれを覚えておいてください

    4. 分散ADを使用してOracleEBSのパッチ適用時間を短縮する方法