0

我正在通过shell 脚本/Perl 程序连接到Oracle/DB2数据库。我连接的数据库需要每 60 天更改一次密码。这是根据我们的安全政策,不能更改。但这在通过 shell 脚本或 perl 程序连接到数据库时会产生问题。要连接到 oracle DB,我们使用下面的 shell 脚本:

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-\)'

IE:

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

首先验证它是否适用于示例文件:不是所有版本的grepsupport \s。如果您没有,[ \t]请改用(是的,空格字符必须在那里,这不是错字)。

于 2011-12-19T14:07:55.437 回答