ã¡ã¿ãªã³ã¯ã«ã€ããŠã¯ã誰ãã解決çããªããšèšããŸãã...
ãªã©ã¯ã«ã¯ãããã§ããŸãã...
ã«ã¹ã¿ã ãœãªã¥ãŒã·ã§ã³ãå®è£
ããããšããããŸããïŒ Oracleã¯ã©ãã§ããïŒ DBMSã®åçãããããç解ããéçºè
ã«å©äŸ¿æ§ãæäŸããããã®ãã¯ããã¯ã®äœ¿çšãæ€èšããããšæããŸãã
åäžã®ã¹ããŒã¹ã§ããŒã¿ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã®éçºãå®è¡ããããã¯ã°ã©ãŠã³ãã§ã·ã¹ãã ã®ã©ã³ãã¹ã±ãŒãã«çµæã転éããå€æŽãèªåçã«èšé²ããæ¹ãã¯ããã«äŸ¿å©ã§ãã
éçºãµãŒããŒã§ã®æŽæ°ã®äŸããããŒã°
æ害ãªDBAã«äŒã£ãããšããããŸããïŒ ããªãã¯ãã®ãããªäººã
ãšåããããšããããŸããïŒ å®éãäž¡æ¹ã®åŽïŒéçºè
ãšDBAïŒã¯ãã·ã¹ãã ã®å¥å
šæ§ãšããåãçµæããç°ãªãåŽããéæããŠããŸãã ãã ããã·ã¹ãã ãæ¡åŒµããããšãåæ£åãããŸãããå®è£
ã®æŽåæ§ã¯ç¶æãããŸãããã®ããããœãããŠã§ã¢ã®äžè²«ããç¶æ
ãç¶æãããšãæ·±å»ãªäžäŸ¿ãçãå§ããŸãã éçºããã¹ãããçç£çãªããµãŒããŒããããŸãããããã¯ãã¹ãŠãã°ãããã§ããããã¹ãŠæŽæ°ããå¿
èŠããããŸãã
Oracleã«ã¯ãåé¡ã®ããŒã«ãšåæ§ã®ããŒã«ããããŸãã
â¢
ç£æ»â¢
Oracle Streamsâ¢
ã¢ã©ãŒããããããããã¯ãã¹ãŠä»ã®æ©èœãå®è¡ããŸãã å€æŽã®ç£æ»ãæäŸãããã®ãããã°ãããŒã¿ãåæãããã®ããããŸãã ãããŠãç§ã¯ããéæã«è¡åããããšæããŸããäŸãã°ïŒ
connect developer@dev begin UpdateServer('prod'); end; / create table a as select * from dual; declare v_id char:='Y'; v_cnt number; begin select count(rownum) into v_cnt from a; if v_cnt = 1 then insert into a values (v_id); end if; end; / begin CommitUpdate; end; /
ããã§ããã¹ãŠã®ã¢ã¯ã·ã§ã³ããprodããµãŒããŒã§è€è£œãããŸãã ãŸãã¯ããã®ããã«ïŒ
begin UpdateFilials; end; /
ãããŠãããšãã°ã7å°ã®ãµãŒããŒãããŒãã«ãAããäœæããŸããã çŽ æŽãããã§ããïŒ ããã§ã¯-è¡ãã
æºåãã
次ã®ã¢ã¯ã·ã§ã³ã«ååãªæš©éãæã€ãŠãŒã¶ãŒã«ä»£ãã£ãŠããŒã¿ããŒã¹ã«æ¥ç¶ããŸãã
connect system
æŽæ°ãå®è¡ãããŠãŒã¶ãŒã¯ãæŽæ°ã·ã¹ãã èªäœã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããããã·ã¹ãã èªäœãã¿ãŒã²ããã¹ããŒã ã«é¢é£ä»ããããŠããªãã®ãšåæ§ã«ãæ®éçã«äœ¿çšã§ãããšæ³å®ãããŠããŸãã ãããã£ãŠãæ°ãããŠãŒã¶ãŒãäœæããŸãã
create user upd identified by pass; User created.
ãã®èšäºã¯æ°èŠãŠãŒã¶ãŒã®æš©å©ãå¶éãããã®ã§ã¯ãªãããïŒ
grant dba to upd; Grant succeded. connect upd/pass Connected.
ç 究ã«ã€ããŠã®è°è«ãçç¥ããæãé£ããããšã¯ãäžèšã®äŸã§ç€ºããå¿åã®PL / SQLãããã¯ãååŸããããšã§ããã åœç¶ãäžéšã®ã¢ã¯ã·ã§ã³ã¯æçµçã«ä»ã®ã¢ã¯ã·ã§ã³ãåŒãèµ·ãããŸããããšãã°ãäŸã®ãã¹ãŠã®åããããã¯ãæ¿å
¥ãå®è¡ããŸãããå®éã«ã¯ããã§ã¯ãªãå ŽåããããŸãã çµå±ãå¥ã®ãµãŒããŒã§å®è¡ãããŸãã ãããã£ãŠãçµæã§ã¯ãªããå¿åã®PL / SQLãããã¯ãç§ãã¡ã®èå³ãåŒãã§ãããã V $ SQLã®ãããªãã¯ã·ããã ãŸãã¯ãããåç
§ãããã¥ãŒV_ $ SQLã¯ããµãŒããŒã§å®è¡ãããŠãããã¹ãŠã®ã¯ãšãªãæ ŒçŽããŸãã ç®æšãèŠã€ããŠã¿ãŸãããã
set linesize 90 begin raise_application_error(-20000, 'Find me'); end; / select sql_id from v$sql where sql_text like '%error(-20000, ''Find%'; SQL_ID
å®éãããã¹ãå Žæã«ããã®ã¯ç§ã®å¿åãããã¯ã§ãã ãã¡ãããç§ã®äŸãå®è¡ãããšãSQL_IDã¯ç°ãªããŸãããããã¯ç§ã«å±ããŸããïŒ ãã§ãã¯ïŒ
connect system
ããããæå±ããŠããŸããããªããã£ãã€ã¶ãŒã¯ãã®ãããªåŒãæ¢ã«å®è¡ãããŠããããšã確èªããç»é²æžã¿ã®SQL_IDãè¿ããŸãã ç§ãã¡ã¯ãã£ãŒã«ãã§ã®ç 究ãããŒã¯ããç 究ãç¶ããŸãïŒ
connect upd/pass Connected.
å®æãããããã¯ãèŠã€ããããšãã§ããŸãããã誰ããããå®è¡ããããç¥ãããã®ã§ãããããããç¹å®ã®æç¹ã§äœãããŠããã®ããæ£ç¢ºã«ç¥ããããšæããŸãã V_ $ SESSIONã®å¥ã®ãã¥ãŒã¯ãããã«åœ¹ç«ã¡ãŸãã
v $ã»ãã·ã§ã³ããsql_idãprev_sql_idãéžæããŸãã
ããã§ã¯ãã·ããã v $ã»ãã·ã§ã³ãVIEWãžã®ã¢ã¯ã»ã¹ãæäŸãããŠãŒã¶ãŒã®ã¢ã¯ã»ã¹ãã³ãã³ãã«ãã£ãŠç·šæãããŠããããšãæ確ã«ããå¿
èŠããããŸãã
vd $ã»ãã·ã§ã³ã®éžæãupdã«èš±å¯ããŸãã
ããã§ã®ãã€ã³ãã¯ããã¥ãŒã¿ã€ãv_ $ã»ãã·ã§ã³ãFIXED VIEWã§ãããããå矩èªã«æš©å©ãäžããããšã¯çŠæ¢ãããŠããããšã§ãã ãã ããããŒãã«ãªã©ã®ã·ããã ã«æš©éãä»äžããå Žåãæš©éèªäœã¯ã·ããã ã§ã¯ãªãããŒãã«ã«å¯ŸããŠçºè¡ãããŸãã
ããã§ããªã¯ãšã¹ãã«ã¯äœããããŸããïŒ ã¯ããçŸåšã®ã»ãã·ã§ã³ã«éžæãå¶éããå¿
èŠããããŸãã
select sid, sql_id, prev_sql_id from v$session where sid = userenv('sid'); SID SQL_ID PREV_SQL_ID
ã©ãã§ãããããŸããããŸãããïŒ SQL_IDãPREV_SQL_IDã«ãã以åã«èŠã€ãã£ãèå¥å753c9f808k8hhãå«ãŸããŠããŸãããïŒ åœç¶ïŒ SQL_IDã«ã¯ãæ°ããå®è¡ãããã¯ãšãªã®èå¥åãå«ãŸããPREV_SQL_IDã«ã¯ã¯ãšãªã®èå¥åãæ ŒçŽãããå¯èœæ§ãæãé«ããªããŸãã
select sql_id, prev_sql_id from v$session;
èªè
ãåŒçšãããšããã«ãªã¯ãšã¹ããé çªã«å®è¡ããæåŸ
ãããå
容ãããã«èŠã€ããããªãã£ãããšãé¡ã£ãŠããŸãã çµæã瀺ããããšããã§ããããšã確èªããã«ã¯ãé çªã«å¿åãããã¯ãšãã¥ãŒã®ãªã¯ãšã¹ããå®è¡ããå¿
èŠããããŸãã ãããããã§ãã£ãŠããç§ã¯ç 究ã®å¥ã®æ®µéãå®äºãããšä¿¡ããŠããŸãã ããã§ãå¿åãããã¯ã®ãœãŒã¹ããã¹ããåŸããããããç§ãã¡ã«ãã£ãŠå®è¡ãããããšãããããŸããã
æ®å¿µãªããããªã³ã¯ãèªååãããœãªã¥ãŒã·ã§ã³ã¯å¥œãã§ã¯ãããŸãããããç¬éã®åŸããŠãŒã¶ãŒã«ãã£ãŠå®è¡ããããã¹ãŠã®å¯èœãªå¿åãããã¯ãèŠããŠããå¿
èŠããããã»ãã·ã§ã³å±¥æŽãä¿åãããŠãŒã¶ãŒã®è¡šçŸããªãããã§ãã ãããšãååšããŸããïŒ ããããçŸæç¹ã§ã¯ãããèŠã€ããŠããŸããã次ã®ã¢ãããŒãããå§ãããŸãã ãªã¹ãã³ã°ã«é¢å¿ã®ããã»ãã·ã§ã³ã®èå¥åãä¿åããããŒãã«ãšããã®ããŒãã«ãããŒãªã³ã°ããŠã»ãã·ã§ã³å±¥æŽãä¿åãããžã§ããäœæããŸãããã
CREATE TABLE UPD.UPD$SESSION_TARGETS (SID NUMBER); Table created. CREATE TABLE UPD.UPD$SESSION_DATA ( KSUSENUM NUMBER, KSUSEUNM VARCHAR2 (30 BYTE), KSUSEMNM VARCHAR2 (64 BYTE), KSUSESQI VARCHAR2 (13 BYTE), KSUSEPSI VARCHAR2 (13 BYTE) ); Table created.
ã2çªç®ã®ããŒãã«ã®ãã£ãŒã«ãã®ååã¯äœã§ããïŒããšå°ããŸãã ããã«ã¯è¯ãèšãèš³ã¯ãããŸãããããžã§ãã«ãã£ãŠäœæãããè² è·ãæå°éã«ããããšããŠãããšããäºå®ã«ãããããããã¿ãŒã²ããã»ãã·ã§ã³ã«é¢ããååãªæ
å ±ãå«ãé«ã¬ãã«ã®sys.x_ $ ksuseã®ã¢ã€ãã¢ã«å°éããŸããã å°æ¥ã®ããã¯ããŒã¯ãäœæãããšãå¿
èŠãªãã£ãŒã«ãã«å ããŠãKSUSENUMïŒSIDïŒãšKSUSESQIïŒSQL_IDïŒã®ããã€ãã®äŸ¿å©ãªãã£ãŒã«ããããŒãã«ã«ä¿åãããŸãã ããã±ãŒãžãæå¹ã§ãªãå Žåã«ãšã©ãŒãåé¿ããããã«ããžã§ãã®æ¬äœãå€éšããã·ãŒãžã£ã«é
眮ããããã±ãŒãžã«è¿œå ããªãããšããå§ãããŸãã
CREATE OR REPLACE procedure UPD.UPD$JobTask is v_cnt number; begin loop select count(rownum) into v_cnt from upd.upd$session_targets; if (v_cnt = 0) then select count(ksusenum) into v_cnt from upd.upd$session_data; if (v_cnt > 0) then execute immediate 'truncate table upd.upd$session_data'; end if; continue; end if; INSERT INTO upd.upd$session_data (KSUSENUM, KSUSEUNM, KSUSEMNM, KSUSESQI, KSUSEPSI) SELECT ksusenum, ksuseunm, ksusemnm, ksusesqi, ksusepsi FROM sys.x_$ksuse WHERE ksusenum IN (SELECT ust.sid FROM upd.upd$session_targets ust) MINUS SELECT ksusenum, ksuseunm, ksusemnm, ksusesqi, ksusepsi FROM upd.upd$session_data; commit; end loop; end UPD$JobTask; / Procedure created.
åŠçã®ã¢ã€ãã¢ã¯ããã®ãšãã ãã»ãã·ã§ã³å±¥æŽã«æžã蟌ã¿ãæŽæ°ã¢ãŒãã§ãŠãŒã¶ãŒãå®è¡ããããšã ãã«æžã蟌ãããšã§ãã ããã§ããžã§ããäœæãããŠãŒã¶ãŒã»ãã·ã§ã³ããªãã¹ã³ããŠçµæã確èªã§ããŸãã
DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X ,what => 'begin /*UPD$SESSION_JOB*/ UPD$JobTask; end;' ,next_date => SYSDATE ,interval => 'SYSDATE + 1/1444' ,no_parse => FALSE ); COMMIT; END; / PL/SQL procedure successfully completed. insert into upd.upd$session_targets values (userenv('sid')); 1 row created. begin raise_application_error(-20000, 'Find me'); end; / Error at line 3 ORA-20000: Find me ORA-06512: at line 2 truncate table upd.upd$session_targets; Table truncated. select KSUSEPSI from upd.upd$session_data; KSUSEPSI
V $ SQLãžã®ã¯ãšãªã®çµæãããããããã«ãå¿åãããã¯ã¯ãžã§ãã«ãã£ãŠããã«æžã蟌ãŸãããã°ããŒãã«ã«å
¥ããŸããã ãã¹ãã§ã¯ããªã¹ãã³ã°æã«ã»ãã·ã§ã³ããŒãã«ãã¯ãªã¢ããã³ãã³ããå®è¡ããªããã°ãªããªãã£ãããããã°ïŒä»¥åã®èŠæ±ïŒã®KSUSEPSIåã«ç®ãåããŸããã å°æ¥çã«ã¯ããããäœããã®æ¬ ç¹ã«ãªãããšãå€æããŸããããªã¢ãŒããµãŒããŒã§å®è¡ãããçµæã»ããããã®ãªã¹ãã³ã°ã®ãäžæããæé€ããŸãã
次ã«ãã¢ããã°ã¬ãŒãäžã«å®è¡ã§ããDLLã³ãã³ããã¢ã»ã³ãã«ããå¿
èŠããããŸãã ããããããã§ççŸããããŸãããªãDDLãåéããã®ã§ãã-ãžã§ããããããåéããå Žåã¯ã©ãã§ããããã æ®å¿µãªãããDDLã¯ãªã¯ãšã¹ãã§ã¯ãªãããã圌ã¯ããããåéããŸããããããã£ãŠãv $ã»ãã·ã§ã³ã«ã¯åæ ãããŸããã ãããã®ç®çã®ããã«ãOracleã¯äœ¿çšå¯èœãªDBMSã¬ãã«ã®ããªã¬ãŒãæäŸããŠããŸãã å®è¡ãããDDLãæ°ããããŒãã«ã«æžã蟌ã¿ããžã§ããšåæ§ã«ãããã·ãŒãžã£ãšãããå®è¡ããããªã¬ãŒãäœæããŸãã
CREATE GLOBAL TEMPORARY TABLE upd.UPD$BUF ( ALIAS_OBJ VARCHAR2 (500 CHAR), SQLTEXT CLOB, OBJNAME VARCHAR2 (30 BYTE) ) ON COMMIT PRESERVE ROWS; Table created. CREATE OR REPLACE PROCEDURE upd.T_PROC_UPD$DDL AUTHID DEFINER AS osuser varchar2(30); machine varchar2(64); cnt number; V_SQL_OUT ORA_NAME_LIST_T; V_SQL_STATEMENT CLOB; V_NUM NUMBER; v_sqlerrm varchar2(2000); BEGIN SELECT count(rownum) INTO cnt FROM upd$session_targets ust WHERE ust.sid = userenv('sid'); if cnt = 0 then return; end if; V_NUM := ORA_SQL_TXT(V_SQL_OUT); FOR I IN 1 .. V_NUM LOOP V_SQL_STATEMENT := V_SQL_STATEMENT || V_SQL_OUT(I); END LOOP; INSERT INTO UPD$BUF (ALIAS_OBJ, SQLTEXT, OBJNAME) VALUES (NULL, V_SQL_STATEMENT, ora_dict_obj_name); EXCEPTION WHEN OTHERS THEN raise_application_error(-20000, SQLERRM); END T_PROC_UPD$DDL; / Procedure created. CREATE OR REPLACE TRIGGER upd.T_UPD$DDL AFTER DDL ON DATABASE BEGIN T_PROC_UPD$DDL; END; / Trigger created.
è¿œå ã®ããŒãã«ãšãã®ã¿ã€ãïŒåæããããŸã§ããŒã¿ãä¿åããGLOBAL TEMPORARYïŒã¯ã次ã®èæ
®äºé
ããéžæãããŸãïŒã»ãã·ã§ã³æ
å ±ãåéãããžã§ãã¯ãæŽæ°ã¹ã¯ãªãããå®è¡ããã»ãã·ã§ã³ãšã¯ç°ãªãã»ãã·ã§ã³ã§æ©èœãããããããã«æžã蟌ãŸããèŠæ±ã¯å®è¡è
ã®ã»ãã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããªããªããŸã; Oracleã«ã¢ããã°ã¬ãŒãåŸã®ããŒãã«ã®ã¯ãªãŒãã³ã°ãæäŸããŸãã DDLããªã¬ãŒã¯ãDDLãå®è¡ãããåãã»ãã·ã§ã³ã§èµ·åããŸãããããã£ãŠããã®å Žåããããã¡ããŒãã«ã«çŽæ¥æžã蟌ãããšãã§ããŸãã ã³ãããåŸã«ããŒãã«ããŒã¿ãä¿åããã®ã¯ãDDLããµã€ã¬ã³ãã³ããããå®è¡ããããã§ãã
ããã·ãŒãžã£ãAUTHID DEFINERãã£ã¬ã¯ãã£ãã䜿çšããŠå®£èšãããŠãããšããäºå®ã«æ³šæããããšãéèŠã§ããããã«ãããåŒã³åºãåŽã®ã¢ã¯ã·ã§ã³ããã倧ããUPDãŠãŒã¶ãŒæš©éã§ã¢ã¯ã·ã§ã³ãèšé²ã§ããŸãã 次ã«ãDDLã®é·ãã決å®ããCLOBãã£ãŒã«ãã«ãããã¡ãŒãä¿åããŸãã
ããªã¬ãŒã¯ïŒAFTERïŒDDLã®åŸã«å®è¡ãããŸããããã¯ããããã¡ãŒã«æžã蟌ãåã«ãã³ãã³ããæ£åžžã«å®è¡ãããããšãæå³ããŸãã
調æ»ãèŠçŽãããšãæŽæ°ãããããŒã¹ã§å®è¡ãããå¯èœæ§ã®ãããã¹ãŠã®çš®é¡ã®æäœããããæçµæ®µéã§ããæŽæ°ããŒã«ã«é²ãããšãã§ããŸãã
å®è£
é·ãè°è«ãšæºåãçµããŠã次ã®ãããªãã®ã§çµããåºçç©ã¯å¥œãã§ã¯ãããŸãããä»ãïŒã°ãã§ã¯ãªãã«ããŠãïŒãæ®ãã®ãŽããã©ããã£ãŠä»äžãããã ãã¡ãããæãè
ãããŸã-ãããã誰ãã次ã«äœãããå¿
èŠãããããé·ãéç解ããŠããŸãã ããããããŒã¿çãšèŠãªãããšãã§ãããšããäºå®ã«ãããããããçŸåšã®å®è£
ãæäŸããŸãã ä»ãå€ãã®ã³ãŒãããããŠèª¬æïŒ
CREATE SEQUENCE UPD.UPD$SEQ_LOG START WITH 0 MAXVALUE 9999999999999999999999999999 MINVALUE 0 NOCYCLE NOCACHE NOORDER; Sequence created. CREATE SEQUENCE UPD.UPD$SEQ_REV START WITH 0 MAXVALUE 9999999999999999999999999999 MINVALUE 0 NOCYCLE NOCACHE NOORDER; Sequence created. CREATE TABLE UPD.UPD$LOG ( ID_LOG NUMBER, DAT_LOG DATE, FQDN_UNAME_OBJ VARCHAR2 (1000 CHAR), ALIAS_OBJ VARCHAR2 (500 CHAR), SQL_TEXT CLOB, ID_REV NUMBER, SQLERRM_LOG VARCHAR2 (2000 CHAR) ); Table created. CREATE TABLE UPD.UPD$SERVERS ( ALIAS_OBJ VARCHAR2 (500 CHAR), DBLINK_OBJ VARCHAR2 (500 CHAR), USERNAME VARCHAR2 (64 CHAR), CALLBACK_DBLINK_OBJ VARCHAR2 (500 CHAR) ); Table created. CREATE OR REPLACE PACKAGE UPD$ AUTHID CURRENT_USER AS procedure BeginUpdateChannel(u_alias varchar2); procedure PrepareUpdateChannel; procedure EndUpdateChannel; procedure CancelUpdate; END UPD$; / Package created. CREATE OR REPLACE PACKAGE BODY UPD$ AS pkg_active_alias varchar2(500); pkg_prepared_alias varchar2(500):=null; pkg_session number:=null; pkg_dblink varchar2(500):=null; pkg_callback_dblink varchar2(500):=null; procedure SetSession(u_sid number, u_remove boolean default false) as pragma autonomous_transaction; l_sid_count number; begin if u_sid is null then raise_application_error(-20550, 'Needless to set'); end if; select count(rownum) into l_sid_count from upd.upd$session_targets ust where ust.sid = u_sid; if l_sid_count = 0 then insert into upd.upd$session_targets (sid) values (u_sid); commit; pkg_session:=u_sid; elsif u_remove then delete from upd.upd$session_targets ust where ust.sid = u_sid; commit; pkg_session:=null; end if; end SetSession; function JobNumber return number as l_jobid number; begin SELECT a.job INTO l_jobid FROM dba_jobs a WHERE a.what like '%/*UPD$SESSION_JOB*/%'; return l_jobid; EXCEPTION WHEN NO_DATA_FOUND THEN return 0; WHEN OTHERS THEN raise; end JobNumber; procedure JobRun as
以åã«äœæããããŒãã«ã«ãããã«2ã€ãè¿œå ãããŸããã1ã€ã¯æ£åžžãªæŽæ°ã確èªããããã«äœ¿çšããã2ã€ç®ã¯ãªã¢ãŒãOracleããŒã¿ããŒã¹ãžã®æ¥ç¶ãã»ããã¢ããããããã«äœ¿çšãããŸãã
ããã±ãŒãžã¯ãAUTHID CURRENT_USERãã£ã¬ã¯ãã£ãã§å®£èšãããŸããããã«ãããããã±ãŒãžã®åŒã³åºãå
ã®ãŠãŒã¶ãŒæš©éã§ããã±ãŒãžããã·ãŒãžã£ãå®è¡ãããŸãã 次ã«ããã¹ãŠã®ããã±ãŒãžæé ã«ã€ããŠïŒ
procedure SetSession(u_sid number, u_remove boolean default false)
-ã¹ã¿ã³ãã¢ãã³ãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããŠããªã¹ãã³ã°ãéå§ããããŒãã«ã«çŸåšã®ã»ãã·ã§ã³èå¥åãæžã蟌ã¿ãŸãã
function JobNumber return number
ãžã§ããªã¹ããŒã®èå¥åãååŸããŸãã
procedure JobRun
ãžã§ãã®ååšã確èªããŸãã
procedure SetChannel(u_alias varchar2)
-ãªã¢ãŒãæ¥ç¶ã®èšå®ãåãåããããã±ãŒãžã®ããŒã«ã«å€æ°ã«æžã蟌ã¿ãŸãã
procedure CancelUpdate
èšå®ãæ¶å»ããäžæããŒãã«ãã¯ãªã¢ããŸãã
procedure BeginUpdateChannel(u_alias varchar2)
-æºåããã·ãŒãžã£ã®åŒã³åºããçµã¿åãããŠããªã¹ãã³ã°ãéå§ããŸãã
procedure PrepareUpdateChannel
-ãªã¹ãã³ã°ãçµäºãããžã§ãã«ãã£ãŠåéãããã»ãã·ã§ã³ãªã¯ãšã¹ãããããã¡ããŒãã«ã«è¿œå ããŸãã ç§èªèº«ã®ããŒãºã®ããã«ãäžçæžåœããããšããããã¹ãäžã«ééããDMLãéžæããµãŒãã¹ã³ãã³ããç Žæ£ããåæ§ã«ã»ãã·ã§ã³ãã°ã«èšé²ãããPrepareUpdateChannelããã·ãŒãžã£ã®åŒã³åºããè¡ããŸãã
procedure DropObject
ã¯ãªãŒãã³ã°ã®è£å©æé ã
procedure ExecRemote
ãªã¢ãŒããµãŒããŒäžã®ãããã¯ã®å®è¡ã ãã®æé ã¯ãã¡ã«ããºã ã®éèŠãªãã€ã³ãã®1ã€ãå®è£
ããŸãã ããã§ã¯ããªã¢ãŒããµãŒããŒäžã§dbms_sqlããã±ãŒãžãåŒã³åºãããŸãã
procedure EndUpdateChannel
æŽæ°ã®é©çšã ãããŠããã«ã€ããŠã¯å¥ã«ã
æåã®å®è£
ãªãã·ã§ã³ã¯ãããã§ç€ºãããã®ãããããã¶ãåçŽã ã£ãããšãäºçŽããŸãã å®éãåçSQLã«ã¯ãvarchar2ïŒå®£èšã«å¿ããŠ32767æåãŸãã¯ãã€ãïŒããé·ããããã¯ãå®è¡ããæ©èœã¯ãããŸããã ããã¯å®å
šã«çå®ã§ã¯ãããŸãããã ããŒã«ã«ã§ã¯ãdbms_sqlã¯ãããèš±å¯ããŸãããLOBãã£ãŒã«ãããªã¢ãŒããµãŒããŒã«è»¢éããããšã¯ã§ããŸããã ãªã¢ãŒããµãŒããŒéã§LOBã転éããæ¹æ³ãç¥ã£ãŠããTom KiteïŒhttps://asktom.oracle.com/pls/apex/f?p=100:11:07::::P11_QUESTION_ID:950029833940ïŒã«æè¬ããŸãã 圌ãç§ã«ãããããæåã®æ¹æ³ãdbms_lob.substrãä»ããŠå®è£
ãããUPD $ BUFããŒãã«ããCLOBãã£ãŒã«ããã«ãŒãããããšãå¬ããæããŸããã ãã®ã¿ã¹ã¯ã®ããã«åœŒãæäŸãã2çªç®ã®æ¹æ³ã¯æ¬¡ã®ããã«ãªããŸãããŠãŒã¶ãŒãæŽæ°ããæš©éãæã€çŸåšã®ãã¹ãã§ããŒãã«ãäœæããçŸåšã®ããŒã¿ããŒã¹ã«æ¥ç¶ããŠãªã¢ãŒãããŒãã«äœæãå®è¡ããŸãã ããã§ãç¹å®ã®å®è£
ã®ããã€ãã®æ¬ ç¹ãææããããšãã§ããŸããã€ãŸããæŽæ°ãåŒãèµ·ãããŠãŒã¶ãŒãäžæããŒãã«ããã®éžææš©éãæããªããããdblinkã®æ¿èªè
ãšçãããªãå Žåã«ãšã©ãŒãèµ·ããå¯èœæ§ããããŸãã ããŒãã«ãåçã«äœæããã³åé€ããŸãã ãµãŒããŒéã§CLOBããå転ããããšãã«ãã§ã«çºçããå¥ã®åé¡ã¯ããšã©ãŒãORA-02046ïŒåæ£ãã©ã³ã¶ã¯ã·ã§ã³ãæ¢ã«éå§ãããŠããŸããã§ããã ã©ãããããã¹ãäžã«ãäžæãããã»ãã·ã§ã³ãçºçãããããªã¢ãŒãæ¥ç¶ã®èå¥åãéãããŸãŸã«ãªããŸããã ãã®ç¶æ³ãåã³ã·ãã¥ã¬ãŒãããããšã¯ã§ããŸããã§ããããç¹°ãè¿ããé¿ããããã«ãåŒã³åºããè¡ãããšãèæ
®ããå¿
èŠããããŸããdbms_session.close_database_linkïŒpkg_dblinkïŒ;
ã³ããŒãããããŒãã«ããã³ãŒããå®è¡ããããã«ãæ¬è³ªçã«åãã³ãŒããå«ãå¿åãããã¯ãçæããããšããŸããããããã«ããååž°ã¬ãã«ã§ã©ã³ã¿ã€ã ãšã©ãŒãçºçããŸããïŒSQLã¬ãã«2ã®ãšã©ãŒã®ãããªãšã©ãŒçªå·ãä¿åããŸããã§ããïŒããããã·ãŒãžã£ãäœæããŸãããã®æåŸã®åé¡ã解決ããããšãã§ããŸããã
ãšã³ããŠãŒã¶ãŒã«å¯ŸããŠãAUTHID DEFINERãã£ã¬ã¯ãã£ãã䜿çšããŠã©ããã³ã°ããã·ãŒãžã£ãäœæããããããé©åãªãŠãŒã¶ãŒã«åŒã³åºãæš©å©ãä»äžã§ããŸãã
create or replace procedure ChannelUpdate(u_alias varchar2) AUTHID DEFINER is begin upd$.BeginUpdateChannel(u_alias); end ChannelUpdate; create or replace procedure ChannelPrepare AUTHID DEFINER is begin upd$.PrepareUpdateChannel; end ChannelPrepare; create or replace procedure ChannelApply AUTHID DEFINER is begin upd$.EndUpdateChannel; end ChannelApply; create or replace procedure ChannelCancel AUTHID DEFINER is begin upd$.CancelUpdate; end ChannelCancel; grant execute on ChannelUpdate to developer; grant execute on ChannelPrepare to developer; grant execute on ChannelApply to developer; grant execute on ChannelCancel to developer; grant select on upd$log to developer;