代码之家  ›  专栏  ›  技术社区  ›  UserControl

在Oracle中删除用户层叠

  •  6
  • UserControl  · 技术社区  · 15 年前

    我需要能够从批处理中删除特定用户(可能有活动会话) 没有任何用户交互 . 我不关心活动会话,希望它们被丢弃并回滚。对于Microsoft SQL,我将用一行代码执行类似的任务:

    osql -E -S localhost -b -Q "use master if ((select name from sysdatabases where name='%DB%') is not null) begin alter database [%DB%] set single_user with rollback immediate drop database [%DB%] end"
    

    我该如何为Oracle(Windows上的10g XE)做到这一点?

    我的当前批次是:

    sqlplus sys/*** as SYSDBA  @delete1.sql >delete.log
    sqlplus sys/***@XE as SYSDBA  @delete2.sql >>delete.log
    

    其中delete1.sql:

    startup force;
    exit;
    

    和delete2.sql:

    drop user MYUSER cascade;
    exit;
    

    与MSSQL解决方案的秒间隔相比,这简直太难看了,而且花费的时间太长。

    4 回复  |  直到 15 年前
        1
  •  3
  •   René Nyffenegger    15 年前

    如果使用以下脚本(此处命名为 drop_user_with_active_sessions.sql ):

    set verify off
    
    begin
    
      for s in (
        select 
          sid, serial#
        from
          v$session
        where 
          username = '&1'
      ) loop
    
        execute immediate 
           'alter system kill session ''' || 
            s.sid     || ',' ||
            s.serial# || ''' immediate';
    
      end loop;
    
      execute immediate 'drop user &1';
    
    end;
    /
    
    exit
    

    和它一起使用

    sqlplus username/password@instance @c:\path\to\drop_user_with_active_session.sql MYUSER
    
        2
  •  0
  •   Harrison    15 年前

    你可以做到 Oracle SQL via the command prompt 然后做你的 cascade drop user .

    我建议创建一个SQL脚本并 executing it from the command line .

    然后可以将命令行文本包装到cmd/batch文件中。

    但是如果您希望Oracle处理整个过程,我建议您查看 job/schedule environment

        3
  •  0
  •   gsiems    15 年前

    除了上面提到的“改变系统终止会话”之外,我还需要在终止会话之前加上如下内容:

    execute immediate 'ALTER SYSTEM DISCONNECT SESSION ''' ||
        to_char(s.sid) || ', ' || to_char(s.serial#) || ''' IMMEDIATE'
    
        4
  •  0
  •   Stephanie Page    15 年前

    从一个数据库平台获取构造,并假设我可以在另一个平台上运行完全相同的东西,这是一个非常非常糟糕的想法。例如。Oracle有创建或替换过程。MSSS不是那么简单。您可以在Oracle中创建一个名为“temp”的表,我们使用DDL。虽然删除用户以重新创建新环境可能是MSS上最简单的方法,但可能有一种更以Oracle为中心的方法来完成相同的事情。在如何完成任务的问题上寻求帮助,而不是为什么你的方法不起作用,这是一个非常好的主意。

    首先,正在测试的应用程序是否执行DDL?到表和其他对象?

    如果它只改变数据,它们是Oracle希望应用程序工作的方式,那么为什么您必须重新创建所有对象。您只需要将数据返回到起点。

    你查过闪回数据库吗?您应该能够创建还原点…做你想做的,然后闪回数据库到那个时间点。

    推荐文章