プロが教える店舗&オフィスのセキュリティ対策術

USER.TABLE_LNK_TRG.shにて、トリガ作成スクリプトUSER.TABLE_LNK_TRG.sqlをコンパイルしようとしています。
USER.TABLE_LNK_TRG.shとUSER.TABLE_LNK_TRG.sqlともに
変数ORACLE_SID_1の値としてdb1、
変数ORACLE_SID_2の値としてdb2
が入っているはずなのですが、USER.TABLE_LNK_TRG.sql内では
${ORACLE_SID_1}と${ORACLE_SID_2}がそのまま文字列として解釈され
(変数の値であるdb1、db2にはならない)、コンパイルに失敗します。
逆にUSER.TABLE_LNK_TRG.sql内で、${ORACLE_SID_1}と${ORACLE_SID_2}
を使わず、直接db1、db2と記述すると成功します。
トリガ作成スクリプトUSER.TABLE_LNK_TRG.sql内で、${変数}は使えないのでしょうか?
環境はOSはSolaris、DBはOracle9i、シェルはBシェルです。
_______________________________________________________________
~USER.TABLE_LNK_TRG.sh~

#!/bin/sh
ORACLE_SID_1="db1"
ORACLE_SID_2="db2"
#トリガコンパイル
sqlplus aaa/aaa <<-EOF
@USER.TABLE_LNK_TRG.sql
quit
EOF
exit
______________________________________________________________
~USER.TABLE_LNK_TRG.sql~

CREATE OR REPLACE TRIGGER USER.TABLE_LNK_TRG
BEFORE UPDATE
ON USER.TABLE FOR EACH ROW
declare
begin
update TABLE@${ORACLE_SID_1}_lnk
set col = :new.col;
update TABLE@${ORACLE_SID_2}_lnk
set col = :new.col;
exception
when others then
null;
end;
/
_______________________________________________________________
※${ORACLE_SID_1}、${ORACLE_SID_2}のままコンパイルされるので、
 ${ORACLE_SID_1}_lnkのDB環境、${ORACLE_SID_2}_lnkのDB環境が存在せずコンパイルエラー。
 逆に直接db1、db2と記述するとdb1_lnkのDB環境、db2_lnkのDB環境が存在するので正常にコンパイル。

A 回答 (1件)

シェルの変数展開は、そのとき読み込まれているシェルスクリプトにしか適用されませんので、SQLスクリプトファイル内に記述しても展開されません。



sqlplusの起動時引数で渡すとか、sedで置換したファイルを読み込むとかで対応しては。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!