私は現在、リモート Oracle DB ソース (ベンダー) から (現在の) Oracle 11g R2 インスタンスにデータをロードするために使用される一連の非常に厄介な VBScript を移行しようとしています。これが基づいているスクリプトは、以前の Oracle 10g インスタンス (完全に異なるマシン) で正常に動作し、DDL 自体は、CN 文字列で使用している同じユーザーの下で手動で実行すると正常に動作します。
ホスト OS: Windows 2008 R2 64 ビット Enterprise Edition
ホスト DB: Oracle 11g R2 64 ビット
脚本:
Option explicit
Dim CN
Dim fso, objFile
Const strOutputFile = "\\<server>\<path>\<to>\LOGS\LOAD_DATA.LOG"
Set CN = CreateObject("ADODB.CONNECTION")
CN.Open "Driver={Oracle in OraDb11g_home1};Dbq=<tnsname>;Uid=<uid>;Pwd=<pwd>;"
Set fso = CreateObject("SCRIPTING.FileSystemObject")
Set objFile = fso.OpenTextFile(strOutputFile, 2, True)
objFile.WriteBlankLines(2)
objFile.WriteLine "*** Start Load_Data.vbs Log - " &Now() &" ***"
Call SBB_BASE()
objFile.WriteLine "*** End Load_Data.vbs Log - " &Now() &" ***"
objFile.WriteBlankLines(2)
objFile.Close
Set objFile = Nothing
Set fso = Nothing
CN.Close
Sub SBB_BASE()
On Error Resume Next
CN.Execute "TRUNCATE TABLE DATA.SBB_BASE"
CN.Execute "DROP TABLE DATA.SBB_BASE"
CN.Execute "CREATE TABLE DATA.SBB_BASE STORAGE (INITIAL 20000 NEXT 1024 PCTINCREASE 0 MINEXTENTS 1 MAXEXTENTS 121) NOLOGGING TABLESPACE DATA AS SELECT * FROM SBB_BASE@<vendor>"
CN.Execute "CREATE INDEX DATA.IDX_SBB_SUB_ACCT_NO ON DATA.SBB_BASE(SUB_ACCT_NO_SBB) TABLESPACE DATA_IDX NOLOGGING"
CN.Execute "CREATE INDEX DATA.IDX_SBB_HSE_KEY ON DATA.SBB_BASE(HSE_KEY_SBB) TABLESPACE DATA_IDX NOLOGGING"
CN.Execute "CREATE INDEX DATA.IDX_SBB_EXT_STAT ON DATA.SBB_BASE(EXT_STAT_SBB) TABLESPACE DATA_IDX NOLOGGING"
CN.Execute "CREATE INDEX DATA.IDX_SBB_CUST_ACCT_NO ON DATA.SBB_BASE(CUST_ACCT_NO_SBB) TABLESPACE DATA_IDX NOLOGGING"
End Sub
コマンド ラインから .vbs を実行すると、最初に信頼されていないスクリプトに関する警告が表示されます (Windows タスク スケジューラから無人で実行しようとすると問題が発生する可能性がありますが、一度に 1 つの問題が発生します)。明らかなエラーなしで実行されているようですが、実行されるのは最初の 2 つのCN.Execute
ステートメント ( theTRUNCATE TABLE
およびDROP TABLE
DDL コマンド) だけです。テーブルとすべてのインデックスがスキーマから消えるため、これが事実であることはわかっています。
ただし、各行から DDL を取得し、CN.Execute
コードのブロックとして手動で実行すると、問題なく動作します。Oracle サーバーに、問題の原因を示すエラー ログが見つかりません。
何かご意見は?
編集: 一息ついてから、DDL ステートメントに追加のログを追加して、何が起こっているのかを把握する方法を見つけましたDBLINK
。ベンダーが親切にもSESSIONS_PER_USER
上限を課したためです。
ただし、データの読み込みに使用できる同じベンダーの異なるユーザーが合計 4 つあります。これらの接続のいずれかがメッセージDBLINKS
と共に戻ってくるかどうかを確認できる機能をスクリプトに組み込みたいと考えています。 SESSIONS_PER_USER
、および後続のデータ読み込みに使用されない最初のもの。それは完全に別の問題なので、別の質問を作成します。