我需要能够从批处理中删除特定用户(可能有活动会话)而无需任何用户交互。我不关心活动会话,并希望将它们删除并回滚。对于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解决方案的瞬间相比需要太长时间。
答案 0 :(得分:3)
如果您使用以下脚本(此处命名为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
答案 1 :(得分:0)
您可以Oracle SQL via the command prompt然后执行cascade drop user。
我建议创建一个sql脚本和executing it from the command line。
然后您可以在cmd / batch文件中包装命令行文本。
但如果您希望Oracle处理整个过程,我建议您查看job/schedule environment
答案 2 :(得分:0)
除了上面提到的“alter system kill session”之外,我还需要在kill会话前面添加如下内容:
execute immediate 'ALTER SYSTEM DISCONNECT SESSION ''' ||
to_char(s.sid) || ', ' || to_char(s.serial#) || ''' IMMEDIATE'
答案 3 :(得分:0)
从一个数据库平台获取构造并假设我可以在不同的平台上运行完全相同的东西是一个非常非常糟糕的主意。例如。 Oracle有Create OR REPLACE过程。 MSSS并不那么简单。 MSSS你可以使用#name创建一个“临时”表,在Oracle中我们使用DDL。虽然让用户重新创建一个新环境可能是MSSS上最简单的方法,但也许有更多以Oracle为中心的方法来完成同样的事情。在如何完成任务方面寻求帮助是一个非常好的主意,而不是为什么你的方式不起作用。
首先,正在测试的应用程序是否执行DDL?表和其他对象?
如果它只改变数据,他们就像Oracle更喜欢应用程序工作,那么为什么你必须重新创建所有对象。您只需将数据恢复到起点即可。
您是否考虑过闪回数据库?您应该能够创建一个还原点...执行任何操作,然后将数据库闪回到该时间点。