Как я могу убить все сеансы, соединяющиеся с моей базой данных оракула?

Безопасная версия. Этот пропустить неудачные разборки, так что неудачный разворот не паникует. Используйте read_line для чтения одной строки.

let mut buf = String::new();

// use read_line for reading single line 
std::io::stdin().read_to_string(&mut buf).expect("");

// this one skips failed parses so that failed unwrap doesn't panic
let v: Vec<i32> = buf.split_whitespace().filter_map(|w| w.parse().ok()).collect();

Вы даже можете прочитать Vector of Vectors, как это.

let stdin = io::stdin();
let locked = stdin.lock();
let vv: Vec<Vec<i32>> = locked.lines()
    .filter_map(
        |l| l.ok().map(
            |s| s.split_whitespace()
                 .filter_map(|word| word.parse().ok())
                 .collect()))
    .collect();

Выше один работает для входов, таких как

2 424 -42 124
42 242 23 22 241
24 12 3 232 445

, а затем превращает их в

[[2, 424, -42, 124],
[42, 242, 23, 22, 241],
[24, 12, 3, 232, 445]]

filter_map принимает замыкание, которое возвращает Option<T> и отфильтровывает все None s.

ok() превращает Result<R,E> в Option<R>, чтобы в этом случае можно было отфильтровать ошибки.

29
задан BIBD 29 February 2016 в 14:52
поделиться

5 ответов

Этот ответ в большой степени под влиянием разговора здесь: http://www.tek-tips.com/viewthread.cfm?qid=1395151&page=3

ALTER SYSTEM ENABLE RESTRICTED SESSION;

begin     
    for x in (  
            select Sid, Serial#, machine, program  
            from v$session  
            where  
                machine <> 'MyDatabaseServerName'  
        ) loop  
        execute immediate 'Alter System Kill Session '''|| x.Sid  
                     || ',' || x.Serial# || ''' IMMEDIATE';  
    end loop;  
end;

я пропускаю сессии уничтожения, происходящие на сервере базы данных, чтобы не избавляться от соединений Oracle с собой.

44
ответ дан Patrick McDonald 1 March 2016 в 00:52
поделиться
  • 1
    Это, кажется, просто универсальная интеграция Facebook (и одно использование старого API в том) - этот doesn' t используют WebViews где угодно. – Eric Brynsvold 1 March 2013 в 08:14

Прежде, чем уничтожить сессии, если это возможно, сделайте

ALTER SYSTEM ENABLE RESTRICTED SESSION;

, чтобы мешать новым сессиям соединиться.

7
ответ дан 1 March 2016 в 00:52
поделиться

Попытка включает вход в систему

Insted попытки пользователей разъединения, которых Вы не должны позволять им соединять.

существует и пример такого триггера.

CREATE OR REPLACE TRIGGER rds_logon_trigger
AFTER LOGON ON DATABASE
BEGIN
  IF SYS_CONTEXT('USERENV','IP_ADDRESS') not in ('192.168.2.121','192.168.2.123','192.168.2.233') THEN
    RAISE_APPLICATION_ERROR(-20003,'You are not allowed to connect to the database');
  END IF;

  IF (to_number(to_char(sysdate,'HH24'))< 6) and (to_number(to_char(sysdate,'HH24')) >18) THEN
    RAISE_APPLICATION_ERROR(-20005,'Logon only allowed during business hours');
  END IF;

END;
1
ответ дан Grrey 1 March 2016 в 00:52
поделиться

Если Вы хотите мешать новым пользователям соединиться, но позволить текущим сессиям продолжаться, пока они не неактивны, можно поместить базу данных в режим QUIESCE:

ALTER SYSTEM QUIESCE RESTRICTED;

От Руководство Администратора Базы данных Oracle :

неDBA активные сессии продолжатся, пока они не станут неактивными. Активная сессия является той, которая является в настоящее время в транзакции, запросе, выборке или МН / SQL-ОПЕРАТОРЕ; или сессия, которая в настоящее время содержит любые совместно используемые ресурсы (например, ставит в очередь). Никаким неактивным сессиям не позволяют стать активными... После того как все сессии не-DBA становятся неактивными, оператор ALTER SYSTEM QUIESCE RESTRICTED завершается, и база данных находится в замороженном состоянии

2
ответ дан Gazmo 1 March 2016 в 00:52
поделиться

Я нашел приведенный ниже фрагмент полезным. Взято из: http://jeromeblog-jerome.blogspot.com/2007/10/how-to-unlock-record-on-oracle.html

select
owner||'.'||object_name obj ,
oracle_username||' ('||s.status||')' oruser ,
os_user_name osuser ,
machine computer ,
l.process unix ,
s.sid||','||s.serial# ss ,
r.name rs ,
to_char(s.logon_time,'yyyy/mm/dd hh24:mi:ss') time
from v$locked_object l ,
dba_objects o ,
v$session s ,
v$transaction t ,
v$rollname r
where l.object_id = o.object_id
and s.sid=l.session_id
and s.taddr=t.addr
and t.xidusn=r.usn
order by osuser, ss, obj
;

Затем запустил:

Alter System Kill Session '<value from ss above>'
;

Чтобы убить отдельные сеансы.

1
ответ дан 28 November 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: