Как избавиться от сообщения об ошибке истечения срока действия пароля при подключении к базе данных Oracle / DB2 в программе сценария / perl оболочки Solaris? - PullRequest
0 голосов
/ 19 декабря 2011

Я подключаюсь к базам данных Oracle / DB2 через сценарий оболочки / программу Perl . Для баз данных, к которым я подключаюсь, потребуется смена пароля каждые 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 возвращает «ОШИБКУ» в качестве возвращаемого значения, что приводит к сбою сценария perl.

Администраторы БД, не согласные установить пароль, не имеют срока действия, поскольку это противоречит политике безопасности. Пароль устанавливается каждые 60 дней. поэтому это сообщение об ошибке начнет всплывать и вызывать ошибку.

Пожалуйста, дайте мне знать, как я могу отключить это сообщение об ошибке от входа / входа в файл журнала.

Заранее спасибо

1 Ответ

0 голосов
/ 19 декабря 2011

Перед перенаправлением в файл журнала введите команду 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] (да, пробел здесь должен быть, это не опечатка).

...