2010-11-04 17 views
6

Tôi cần có khả năng thả người dùng cụ thể (có thể có phiên hoạt động) từ lô mà không có bất kỳ tương tác nào của người dùng. Tôi không quan tâm đến các phiên hoạt động và muốn họ bị loại bỏ và quay trở lại. Đối với Microsoft SQL, tôi sẽ thực hiện nhiệm vụ tương tự với một dòng:thả thác người dùng trong Oracle

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" 

Làm cách nào để làm điều đó cho Oracle (10g XE trên Windows)?

hàng loạt hiện tại của tôi là:

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

nơi delete1.sql:

startup force; 
exit; 

và delete2.sql:

drop user MYUSER cascade; 
exit; 

Đây là xấu xí như địa ngục và mất nhiều thời gian so sánh đến phần thứ hai của giải pháp MSSQL.

+2

Trong Oracle, người dùng có một lược đồ để có rất nhiều thứ liên quan đến việc bỏ người dùng, đặc biệt nếu có nhiều đối tượng thuộc sở hữu của nó. Cân nhắc thực hiện một NGƯỜI DÙNG ALTER ... TÀI KHOẢN KHÓA và sau đó thả nó sau vào một thời điểm thuận tiện hơn. –

+0

Tần suất bạn cần phải bỏ người dùng - tại sao hiệu suất của nó lại là vấn đề? –

+0

Đây là một phần của quá trình CI của tôi (xây dựng -> tạo lại lược đồ db -> chạy thử nghiệm tích hợp) để nó được thực thi gần như trên mọi cam kết. Tôi có thể sống với hiệu suất của nó nhưng tôi bị sốc Oracle không có phương tiện cho việc này. Tôi không hỏi điều gì đặc biệt, phải không? – UserControl

Trả lời

3

Nó sẽ làm việc nếu bạn sử dụng đoạn mã sau (ở đây đặt tên 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 

Và sử dụng nó với

sqlplus username/[email protected] @c:\path\to\drop_user_with_active_session.sql MYUSER 
+0

L ERI tại dòng 1: ORA- 01940: không thể bỏ người dùng hiện đang kết nối ORA-06512: tại dòng 19 – UserControl

0

Ngoài "thay đổi phiên giết hệ thống" được đề cập ở trên, tôi cũng cần phải mở đầu tiêu diệt ion với một cái gì đó như:

execute immediate 'ALTER SYSTEM DISCONNECT SESSION ''' || 
    to_char(s.sid) || ', ' || to_char(s.serial#) || ''' IMMEDIATE' 
0

Đó là một ý tưởng rất, rất tồi khi lấy một cấu trúc từ một nền tảng Cơ sở dữ liệu và giả sử tôi có thể chạy cùng một thứ trên cùng một nền tảng khác. Ví dụ. Oracle đã tạo thủ tục HOẶC THAY THẾ. MSSS không đơn giản lắm. MSSS bạn có thể tạo một bảng "temp" với #name, trong Oracle chúng ta sử dụng DDL. Trong khi thả một người dùng để tạo lại một môi trường mới có thể là cách tiếp cận đơn giản nhất trên MSSS, có lẽ có một cách làm trung tâm của Oracle để thực hiện điều tương tự. Đó là một ý tưởng rất tốt để yêu cầu giúp đỡ về cách thực hiện một nhiệm vụ thay vì tại sao cách của bạn không hoạt động.

Trước tiên, ứng dụng có đang được thử nghiệm làm DDL không? đến các bảng và các đối tượng khác?

Nếu nó chỉ thay đổi dữ liệu, theo cách đó, Oracle thích ứng dụng hoạt động, vậy tại sao bạn phải tạo lại tất cả các đối tượng. Bạn chỉ cần lấy lại dữ liệu về điểm xuất phát.

Bạn đã xem xét Cơ sở dữ liệu Flashback chưa? Bạn sẽ có thể tạo ra một điểm khôi phục ... làm bất cứ điều gì bạn muốn và sau đó flashback cơ sở dữ liệu đến thời điểm đó.

+0

Tôi không phải chuyên gia Oracle và chỉ có giải pháp làm việc (cho tôi) mà tôi mô tả. Tôi xem xét nó xấu xí và tự hỏi nếu có một tốt hơn (vì nó là trên DBMS khác - SQL máy chủ ví dụ). – UserControl

+0

Tôi ước gì tôi biết tại sao đây không phải là câu trả lời hay. Cơ sở dữ liệu Flashback sẽ dễ dàng hơn nhiều so với việc xóa và tạo lại mọi thứ. –