如何重现ORA-01940:无法删除当前通过Jenkins管道连接的用户?

时间:2020-07-21 08:36:21

标签: sql oracle jenkins jenkins-pipeline

通过詹金斯管道,如果出现错误ORA-01940: cannot drop a user that is currently connected,我想执行一些操作。

进行测试,我应该得到该消息。如果我创建用户并使用它登录到sql developer,然后尝试通过管道将其删除,则会导致上述错误-

sh '''
   sqlplus -s /nolog <<-EOF
   connect system/system@orcl
   DROP USER TEST_USER;
   exit
   EOF
'''

我可以使用该用户进行连接并通过管道将其丢弃,从而导致上述错误吗?

1 个答案:

答案 0 :(得分:0)

如果使用外壳程序脚本通过Jenkins中的PIPELINE运行该零件,则有一些选项:

获取操作的特定返回码

在这种情况下,您可以执行以下操作

sh '''
   sqlplus -s /nolog <<-EOF
   connect system/system@orcl
   whenever sqlerror exit 99
   DROP USER TEST_USER;
   exit
   EOF
''' 

如果出现错误,此操作将返回99。您必须使用$?

评估操作的返回值

示例

会话1(作为系统)

SQL> create user test identified by Oracle_1 ;

User created.

SQL> grant connect to test ;

Grant succeeded.

我与用户测试连接,然后与系统用户连接,我将尝试删除它

SQL> whenever sqlerror exit 99
SQL> drop user test ;
drop user test
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected


Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64                                                                 bit Production
[ftpcpl@scglvdoracp0040 ~]$ echo $?
99

使用PLSQL块返回代码或消息

但是,如果您想要的东西与以前的选项不同,例如自动显示代码而不进行评估,那么您可以使用匿名PL / SQL块在输出中显示消息。

在您的情况下,我会使用类似这样的内容:

sh '''
   sqlplus -s /nolog <<-EOF
   connect system/system@orcl
   set serveroutput on feedback off
   declare
   user_is_conn exception;
   verror varchar2(100);
   pragma exception_init ( user_is_conn , -1940 );
   begin
       execute immediate q'[ DROP USER TEST ]';
       exception 
       when user_is_conn then 
          verror := sqlerrm ; -- the whole error message
          -- verror := sqlcode ; -- only the  code 1940
          dbms_output.put_line(verror); -- message 
       when others then 
          raise;
   end;
   /       
   exit
   EOF
''' 

我在前面的部分中评论了verror := sqlcode,以显示整个消息。在Linux上运行的示例如下:

$ $ORACLE_HOME/bin/sqlplus -S "/ as sysdba" << eof
set serveroutput on feedback off
   declare
   user_is_conn exception;
   verror varchar2(100);
   pragma exception_init ( user_is_conn , -1940 );
   begin
   execute immediate 'DROP USER TEST' ;
   exception
   when user_is_conn then
      verror := sqlerrm ;
              dbms_output.put_line(verror);
           when others then
              raise;
   end;
/
eof
ORA-01940: cannot drop a user that is currently connected

请注意,此PL / SQL块已结束。我的意思是,从OS角度来看,操作返回码为0。如果您希望将其作为错误,则需要引发该错误,但是在这种情况下,消息将有所不同。