我连接到Oracle/DB2数据库通过shell脚本/Perl程序。数据库,我正在连接将需要密码更改每60天。这是我们的安全政策,不能更改。但是,当通过shell脚本或perl程序连接到数据库时,这是创建问题。要连接到oracle数据库,我们使用下面的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 "nn---------------------------->>`date`extraction successfulnn---------------------------->>" >> $log
else
echo "nn---------------------------->>`date` Error with extraction from Tablenn---------------------------->>" >> $log
exit -5
fi
但是保存数据库连接部分日志的SITE_SQL.log中出现了以下错误信息
ERROR:
ORA-28002: the password will expire within 13 days
使脚本失败。但是连接发生在数据库中,我们在spool文件中获得所需的数据。当脚本检查日志文件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_Statementn$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;
}
在这里,因为我们得到密码过期警报错误消息subeexecutesql函数返回" error "作为返回值,这是使perl脚本失败。
DBA不同意设置密码不过期选项,因为它违反了安全策略。密码设置为每60天修改一次。因此,这个错误信息将开始弹出并导致失败。
请让我知道我如何才能抑制这个错误信息从获取/登录到日志文件
Thanks in advance
在重定向到日志文件之前,在管道中放置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]
代替(是的,空格字符必须在那里,这不是打字错误)。