2014年3月9日日曜日

【Oracle】SecureFiles LOB

SecureFiles LOBを含んだテーブルの作り方

create table sh.t01 (empid number,c01 clob) tablespace securefile_tbs
lob (c01) store as securefile(
compress high
DEDUPLICATE
);

#確認を行う
SH@PROD1 > select table_name,TABLESPACE_NAME,COMPRESSION,DEDUPLICATION from user_lobs;

TABLE_NAME                     TABLESPACE_NAME                COMPRE DEDUPLICATION
------------------------------ ------------------------------ ------ ---------------
DR$SUP_TEXT_IDX$R              EXAMPLE                        NONE   NONE
DR$SUP_TEXT_IDX$I              EXAMPLE                        NONE   NONE
T01                             SECUREFILE_TBS                       HIGH   LOB

#圧縮率をhighからlowに変えてみる
ALTER TABLE t01 MODIFY
LOB(c01) (
COMPRESS LOW
);

SH@PROD1 > select table_name,TABLESPACE_NAME,COMPRESSION,DEDUPLICATION from user_lobs;

TABLE_NAME                     TABLESPACE_NAME                COMPRE DEDUPLICATION
------------------------------ ------------------------------ ------ ---------------
DR$SUP_TEXT_IDX$R              EXAMPLE                        NONE   NONE
DR$SUP_TEXT_IDX$I              EXAMPLE                        NONE   NONE
T01                             SECUREFILE_TBS                       LOW    LOB

BasicFiles LOB から SecureFiles LOB への移行

オンライン再定義を行う必要を試す。
オンライン定義そのもののマニュアルは管理者ガイド。
http://docs.oracle.com/cd/E16338_01/server.112/b56301/tables.htm#i1006790


#接続
conn scott/tiger

#表作成
create table cust
(
c_id number primary key,
c_zip number,
c_name varchar(30) default null,
c_lob clob
);

#データを入れる
INSERT INTO cust VALUES(1, 94065, 'hhh', 'ttt');


#オンライン再定義するのに必要な権限をつける
#後半二つはDBMS_REDEFINITION.COPY_TABLE_DEPENDENTSを実行するのに必要
GRANT EXECUTE ON DBMS_REDEFINITION TO scott;
GRANT ALTER ANY TABLE TO scott;
GRANT DROP ANY TABLE TO scott;
GRANT LOCK ANY TABLE TO scott;
GRANT CREATE ANY TABLE TO scott;
GRANT SELECT ANY TABLE TO scott;
GRANT CREATE ANY TRIGGER TO scott;
DECLARE
error_count pls_integer := 0;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS
('scott', 'cust', 'cust_int',
1, TRUE,TRUE,TRUE,FALSE, error_count);
   
DBMS_OUTPUT.PUT_LINE('errors := ' || TO_CHAR(error_count));
END;
/


#オンライン再定義をするための仮表をつくる(仮表はSecureFilesのLOBを持った表)
conn scott/tiger
CREATE TABLE cust_int
(c_id NUMBER NOT NULL,
c_zip NUMBER,
c_name VARCHAR(30) DEFAULT NULL,
c_lob CLOB
)
LOB(c_lob)
STORE AS SECUREFILE (NOCACHE FILESYSTEM_LIKE_LOGGING);

#元表と仮表の列名の紐づけを行う。
#col_mappingが長いので変数化して外だししているっぽい。

DECLARE
col_mapping VARCHAR2(1000);
BEGIN
col_mapping :=
'c_id c_id , '||
'c_zip c_zip , '||
'c_name c_name, '||
'c_lob c_lob';
DBMS_REDEFINITION.START_REDEF_TABLE('scott', 'cust', 'cust_int', col_mapping);
END;
/

#依存オブジェクト(索引や権限など)をコピーする。
マニュアルではCONS_ORIG_PARAMSという定数を使っているが、値=1(索引コピーしますという意味)なので
最初から1を入れておく。なので、

DECLARE
error_count pls_integer := 0;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS
('scott', 'cust', 'cust_int',
1, TRUE,TRUE,TRUE,FALSE, error_count);
   
DBMS_OUTPUT.PUT_LINE('errors := ' || TO_CHAR(error_count));
END;
/

#エラーがあるか確認
select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS where BASE_TABLE_NAME='SCOTT.CUST';
SYS@PROD1 > select object_name, base_table_name, ddl_txt from DBA_REDEFINITION_ERRORS where BASE_TABLE_NAME='CUST';

レコードが選択されませんでした。


#再定義を完了
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('scott', 'cust', 'cust_int');

#変換できたか確認
select TABLE_NAME,SECUREFILE,COLUMN_NAME from user_lobs


TABLE_NAME                     SEC COLUMN_NAME
------------------------------ --- ------------------------------
CUST_INT                       NO  C_LOB
CUST                           YES C_LOB



<全体的な参考箇所>
Oracle® Database SecureFilesおよびラージ・オブジェクト開発者ガイド
4 Oracle SecureFiles LOBの使用
http://docs.oracle.com/cd/E16338_01/appdev.112/b56263/adlob_smart.htm#BABDIEGE

0 件のコメント:

コメントを投稿