如何重现ora-01940:不能删除当前通过jenkins管道连接的用户?

zqdjd7g9  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(247)

通过Jenkins管道,如果我出错了 ORA-01940: cannot drop a user that is currently connected ,我想执行一些操作。
为了测试我应该得到这个信息。如果我创建一个用户并用它登录到sqldeveloper,然后尝试通过管道将其删除,则会导致上述错误-

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

有没有什么方法我可以连接使用该用户,并通过管道,使其结果进入上述错误?

brccelvz

brccelvz1#

如果您使用shell脚本通过jenkins中的管道运行该部分,则有以下几种选择:
获取操作的特定返回代码
在这种情况下,您可以执行以下操作

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块结束时是正常的。我的意思是,从操作系统的Angular 来看,操作返回码是0。如果要将其作为错误,则需要引发错误,但在这种情况下,消息会有所不同。

相关问题