0

シェル スクリプト/Perl プログラムを使用してOracle/DB2データベースに接続しています。私が接続しているデータベースでは、60 日ごとにパスワードを変更する必要があります。これは当社のセキュリティ ポリシーによるものであり、変更することはできません。しかし、これは、シェル スクリプトまたは perl プログラムを介してデータベースに接続するときに問題を引き起こします。Oracle DB に接続するには、以下のシェル スクリプトを使用します。

sqlplus -s ${USER_NAME}/${PASSWD}@${DATABASE_NAME} <<EOF > $SQL_LOG/SITE_SQL.log
set echo off
set trimspool on
set pages 0
set linesize 1500
set feedback off
set head off

spool ${ETL_DIR}/SITE.txt
select LTRIM(RTRIM(COLUMN1))||'|'||LTRIM(RTRIM(COLUMN2)) from TABLE where COLUMN2 IN      (${SITES});
exit
EOF

grep -i 'error' $SQL_LOG/SITE_SQL.log
if [ $? -ne 0 ]
then
echo "\n\n---------------------------->>`date`extraction successful\n\n---------------------------->>"  >> $log
else
echo "\n\n---------------------------->>`date` Error with  extraction from Table\n\n---------------------------->>" >> $log
exit -5
fi

ただし、データベース接続部分のログを保持する SITE_SQL.log は、エラーメッセージの下に表示されます。

ERROR:
ORA-28002: the password will expire within 13 days

これにより、スクリプトが失敗します。しかし、データベースへの接続が発生し、必要なデータがスプール ファイルに取得されます。スクリプトがログ ファイル SITE_SQL.log でエラーをチェックすると、失敗します。エラー処理部分を変更したくありませんが、このメッセージがログファイルに表示/記録されるのを抑制して、スクリプトがログファイルにこのエラーメッセージを表示しないようにします。

また、同じ問題に直面している perl スクリプトもあります。以下は使用したコードです。

my $l_Var_SQL_Statement="Select to_date('$Var_Data_Date_1','YYYY-MM-DD')-max(load_date)     from TABLE where LOAD_STATUS='Success'";

   $RetVal=SubExecuteSQL($Var_REP_TMP,$Var_USER_DB,$Var_USER_DBUSER,$Var_USER_DBPASSWORD,$l_Var_SQL_Statement);
if($RetVal eq "ERROR") {
    $system_date=`date`;
    chomp($system_date);
    $Message="$system_date:Error Executing Query   :$l_Var_SQL_Statement\n$system_date:Database Details:DB=$Var_USER_DB,Use
    r ID=$Var_USER_DBUSER, Password= $Var_USER_DBPASSWORD  for $my_filename Repository";
    SubWriteLogMsg("$Var_REP_LOG","$Var_REP_LOGFILE","$Message");
    $Message="Error Executing Query :$l_Var_SQL_Statement. Check log file for        connection details.";
    SubWriteMailMsg("$Var_INFA_MAILFOLDER","$Var_INFA_MAILFILE","$Message");
           SubLogLoadAbort("$Var_REP_LOG","$Var_REP_LOGFILE","$Var_INFA_MAILFOLDER","$Var_INFA_MAILFILE");
    exit -1;
    }

ここでは、パスワードの有効期限切れ警告エラー メッセージが表示されているため、SubExecuteSQL 関数が戻り値として "ERROR" を返しているため、perl スクリプトが失敗しています。

DBA は、セキュリティ ポリシーに反するため、パスワードを期限切れにしないオプションを設定することに同意していません。パスワードは 60 日ごとに変更するように設定されています。そのため、このエラー メッセージがポップアップ表示され始め、障害が発生します。

このエラー メッセージがログ ファイルに取得/ログインされないようにする方法を教えてください。

前もって感謝します

4

1 に答える 1

0

ログ ファイルにリダイレクトする前に、次のような grep コマンドをパイプに挿入します。

| grep -v '^\s*\(ERROR:$\|ORA-\)'

すなわち:

sqlplus -s ${USER_NAME}/${PASSWD}@${DATABASE_NAME} <<EOF | grep -v '^\s*\(ERROR:|ORA-)' > $SQL_LOG/SITE_SQL.log

最初にサンプル ファイルで動作することを確認します。grepサポートのすべてのバージョンではありません\s。そうでない場合は、[ \t]代わりに使用してください(はい、スペース文字がそこにある必要があります。タイプミスではありません)。

于 2011-12-19T14:07:55.437 に答える