Безопасная версия. Этот пропустить неудачные разборки, так что неудачный разворот не паникует. Используйте 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>
, чтобы в этом случае можно было отфильтровать ошибки.
Этот ответ в большой степени под влиянием разговора здесь: 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 с собой.
Прежде, чем уничтожить сессии, если это возможно, сделайте
ALTER SYSTEM ENABLE RESTRICTED SESSION;
, чтобы мешать новым сессиям соединиться.
Попытка включает вход в систему
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;
Если Вы хотите мешать новым пользователям соединиться, но позволить текущим сессиям продолжаться, пока они не неактивны, можно поместить базу данных в режим QUIESCE:
ALTER SYSTEM QUIESCE RESTRICTED;
От Руководство Администратора Базы данных Oracle :
неDBA активные сессии продолжатся, пока они не станут неактивными. Активная сессия является той, которая является в настоящее время в транзакции, запросе, выборке или МН / SQL-ОПЕРАТОРЕ; или сессия, которая в настоящее время содержит любые совместно используемые ресурсы (например, ставит в очередь). Никаким неактивным сессиям не позволяют стать активными... После того как все сессии не-DBA становятся неактивными, оператор ALTER SYSTEM QUIESCE RESTRICTED завершается, и база данных находится в замороженном состоянии
Я нашел приведенный ниже фрагмент полезным. Взято из: 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>'
;
Чтобы убить отдельные сеансы.