Oracle解鎖表、包、用戶、殺會(huì)話、停job的方法實(shí)現(xiàn)
一、創(chuàng)建包tzq_server_pkg
sys用戶以sysdba身份登錄Oracle數(shù)據(jù)庫(kù),創(chuàng)建包 tzq_server_pkg ,上代碼:
CREATE OR REPLACE PACKAGE sys.tzq_server_pkg IS
PROCEDURE unlock_table(table_owner IN VARCHAR2, table_name IN VARCHAR2);
PROCEDURE unlock_package(package_owner IN VARCHAR2,
package_name IN VARCHAR2);
PROCEDURE unlock_user(username IN VARCHAR2);
PROCEDURE stop_job(job_id IN NUMBER);
PROCEDURE kill_session(se_sid IN NUMBER, se_serail# IN NUMBER);
PROCEDURE grant_pris(username IN VARCHAR2);
END tzq_server_pkg;
/
CREATE OR REPLACE PACKAGE body SYS.tzq_server_pkg IS
PROCEDURE unlock_table(table_owner IN VARCHAR2, table_name IN VARCHAR2) IS
CURSOR c1 IS
SELECT DISTINCT '''' || s.sid || ',' || s.serial# || ',@' || s.inst_id || '''' AS si_id
FROM gv$locked_object l
,dba_objects o
,gv$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
AND l.inst_id = s.inst_id
AND o.owner = upper(table_owner)
AND o.object_name = upper(table_name);
c1_rec c1%ROWTYPE;
v_sql VARCHAR2(2000);
BEGIN
FOR c1_rec IN c1 LOOP
v_sql := 'alter system kill session ' || c1_rec.si_id || ' immediate';
dbms_output.put_line(v_sql);
BEGIN
EXECUTE IMMEDIATE v_sql;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
END LOOP;
END unlock_table;
PROCEDURE unlock_package(package_owner IN VARCHAR2,
package_name IN VARCHAR2) IS
CURSOR c1 IS
SELECT DISTINCT '''' || a.sid || ',' || a.serial# || ',@' || a.inst_id || '''' AS si_id
FROM gv$session a
,gv$access b
WHERE b.object = upper(package_name)
AND b.owner = upper(package_owner)
AND a.sid = b.sid
AND a.inst_id = b.inst_id;
c1_rec c1%ROWTYPE;
v_sql VARCHAR2(2000);
BEGIN
FOR c1_rec IN c1 LOOP
v_sql := 'alter system kill session ' || c1_rec.si_id || ' immediate';
dbms_output.put_line(v_sql);
BEGIN
EXECUTE IMMEDIATE v_sql;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
NULL;
END;
END LOOP;
END unlock_package;
PROCEDURE unlock_user(username IN VARCHAR2) IS
us_name VARCHAR2(200) := username;
v_sql VARCHAR2(2000);
BEGIN
v_sql := 'alter user ' || us_name || ' account unlock';
BEGIN
EXECUTE IMMEDIATE v_sql;
dbms_output.put_line(us_name || '''s account is unlock');
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
END unlock_user;
PROCEDURE stop_job(job_id IN NUMBER) IS
CURSOR c1 IS
SELECT DISTINCT '''' || a.sid || ',' || a.serial# || ',@' || a.inst_id || '''' AS si_id
FROM gv$session a
,(SELECT v.sid
,v.id2 job
,v.inst_id inst_id
FROM sys.job$ j
,gv$lock v
WHERE v.type = 'JQ'
AND j.job(+) = v.id2) b
,gv$instance c
WHERE a.inst_id = b.inst_id
AND a.sid = b.sid
AND a.inst_id = c.inst_id
AND c.inst_id = b.inst_id
AND b.job = job_id;
c1_rec c1%ROWTYPE;
v_sql VARCHAR2(2000);
BEGIN
FOR c1_rec IN c1 LOOP
v_sql := 'alter system kill session ' || c1_rec.si_id || ' immediate';
dbms_output.put_line(v_sql);
BEGIN
EXECUTE IMMEDIATE v_sql;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
NULL;
END;
END LOOP;
END stop_job;
PROCEDURE kill_session(se_sid IN NUMBER, se_serail# IN NUMBER) IS
p_sid NUMBER := se_sid;
p_serail NUMBER := se_serail#;
is_back_process NUMBER := 0;
CURSOR c1 IS
SELECT DISTINCT '''' || a.sid || ',' || a.serial# || ',@' || a.inst_id || '''' AS si_id
FROM gv$session a
WHERE a.sid = p_sid
AND a.serial# = p_serail;
c1_rec c1%ROWTYPE;
v_sql VARCHAR2(2000);
BEGIN
IF se_sid IS NULL OR se_serail# IS NULL THEN
dbms_output.put_line('sid is null or serail# is null');
RETURN;
END IF;
BEGIN
SELECT 1
INTO is_back_process
FROM gv$session
WHERE sid = se_sid
AND serial# = se_serail#
AND TYPE = 'BACKGROUND';
EXCEPTION
WHEN OTHERS THEN
is_back_process := 0;
END;
IF is_back_process = 1 THEN
RETURN;
END IF;
FOR c1_rec IN c1 LOOP
v_sql := 'alter system kill session ' || c1_rec.si_id || ' immediate';
dbms_output.put_line(v_sql);
BEGIN
EXECUTE IMMEDIATE v_sql;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
NULL;
END;
END LOOP;
END kill_session;
PROCEDURE grant_pris(username IN VARCHAR2) IS
us_name VARCHAR2(200) := username;
v_sql VARCHAR2(2000);
v_sql2 VARCHAR2(2000);
v_sql3 VARCHAR2(2000);
v_sql4 VARCHAR2(2000);
v_sql5 VARCHAR2(2000);
v_sql6 VARCHAR2(2000);
v_sql7 VARCHAR2(2000);
BEGIN
v_sql := 'grant create synonym,create table,create type,create sequence,create view ,create materialized view,create job,create database link,connect,resource,create procedure ,debug any procedure, debug connect session to ' ||
us_name;
v_sql2 := 'grant select on gv_$locked_object to ' || us_name;
v_sql3 := 'grant select on dba_objects to ' || us_name;
v_sql4 := 'grant select on gv_$session to ' || us_name;
v_sql5 := 'grant select on gv_$process to ' || us_name;
v_sql6 := 'grant select on gv_$sql to ' || us_name;
v_sql7 := 'grant select on gv_$access to ' || us_name;
BEGIN
EXECUTE IMMEDIATE v_sql;
EXECUTE IMMEDIATE v_sql2;
EXECUTE IMMEDIATE v_sql3;
EXECUTE IMMEDIATE v_sql4;
EXECUTE IMMEDIATE v_sql5;
EXECUTE IMMEDIATE v_sql6;
EXECUTE IMMEDIATE v_sql7;
dbms_output.put_line('grant success!');
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
END grant_pris;
END tzq_server_pkg;
/
二、授權(quán)給需要使用的用戶log
sys用戶以sysdba身份登錄Oracle數(shù)據(jù)庫(kù),給需要使用該包(sys.tzq_server_pkg)的用戶授予 execute 的權(quán)限,執(zhí)行下面命令授權(quán):
grant execute on sys.tzq_server_pkg to log;

三、解鎖表:執(zhí)行存過unlock_table(schema_name, table_name)
以上面被授權(quán)的log用戶,打開命令行窗口,執(zhí)行下列SQL:
set serveroutput on
execute sys.tzq_server_pkg.unlock_table('LOG','tzq_log_t');

四、解鎖包:執(zhí)行存過unlock_package(schema_name, pkg_name)
以上面被授權(quán)的log用戶,打開命令行窗口,執(zhí)行下列SQL:
set serveroutput on
execute sys.tzq_server_pkg.unlock_package('LOG','tzq_log_pkg');

五、解鎖用戶:執(zhí)行存過unlock_user(username)
以上面被授權(quán)的log用戶,打開命令行窗口,執(zhí)行下列SQL:
set serveroutput on
execute sys.tzq_server_pkg.unlock_user('LOG');

六、停止job任務(wù):執(zhí)行存過stop_job(job_id)
以上面被授權(quán)的log用戶,打開命令行窗口,執(zhí)行下列SQL:
set serveroutput on execute sys.tzq_server_pkg.stop_job(6);

七、殺session會(huì)話:執(zhí)行存過kill_session(se_sid, se_serail#)
7.1、查詢需要kill的session的SID及serial#
執(zhí)行下列SQL:
SELECT * FROM gv$session;
找到你需要kill的那個(gè)session會(huì)話,拿到SID及serial#:159, 3729

7.2、執(zhí)行存過kill_session(se_sid, se_serail#)
執(zhí)行存過kill_session(),kill掉上面的那個(gè)session會(huì)話。在命令行執(zhí)行下面的SQL:
set serveroutput on execute sys.tzq_server_pkg.kill_session(159, 3729);

八、給新建的用戶授權(quán):執(zhí)行存過 grant_pris(username)
以上面被授權(quán)的log用戶,打開命令行窗口,執(zhí)行下列SQL:
set serveroutput on
execute sys.tzq_server_pkg.grant_pris('log');

到此這篇關(guān)于Oracle解鎖表、包、用戶、殺會(huì)話、停job的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Oracle解鎖表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux下啟動(dòng)Oracle服務(wù)和監(jiān)聽程序步驟
這篇文章給大家介紹了Linux下啟動(dòng)Oracle服務(wù)和監(jiān)聽程序步驟,在文章末尾給大家介紹了Oracle數(shù)據(jù)庫(kù)的啟動(dòng)和關(guān)閉方式小結(jié),感興趣的朋友一起看看吧2017-08-08
Oracle表空間數(shù)據(jù)庫(kù)文件收縮案例解析
這篇文章主要介紹了Oracle表空間數(shù)據(jù)庫(kù)文件收縮案例解析,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
oracle表空間不足ORA-01653的問題:?unable?to?extend?table
這篇文章主要介紹了oracle表空間不足ORA-01653:?unable?to?extend?table的問題?,出現(xiàn)這種表空間不足的問題一般有兩種情況:一種是表空間的自動(dòng)擴(kuò)展功能沒有打開,另一種確實(shí)是表空間確實(shí)不夠用了,已經(jīng)達(dá)到了擴(kuò)展的極限,本文給大家分享解決方法,需要的朋友參考下2022-08-08
Navicat?Premium連接Oracle數(shù)據(jù)庫(kù)的2種方式
這篇文章主要給大家介紹了關(guān)于Navicat?Premium連接Oracle數(shù)據(jù)庫(kù)的2種方式,大家要使用Navicat Premium連接Oracle數(shù)據(jù)庫(kù),請(qǐng)按照以下步驟操作,需要的朋友可以參考下2024-01-01
Drop、Delete與Trunc的區(qū)別和應(yīng)用方式
這篇文章主要介紹了Drop、Delete與Trunc的區(qū)別和應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
oracle創(chuàng)建新用戶以及用戶權(quán)限配置、查詢語(yǔ)句
在Oracle數(shù)據(jù)庫(kù)中要?jiǎng)?chuàng)建一個(gè)用戶并僅賦予查詢權(quán)限,你可以按照以下步驟進(jìn)行操作,這篇文章主要給大家介紹了關(guān)于oracle創(chuàng)建新用戶以及用戶權(quán)限配置、查詢語(yǔ)句的相關(guān)資料,需要的朋友可以參考下2024-03-03
Oracle Max函數(shù)使用中出現(xiàn)的問題
在Oracle Max函數(shù)使用中,會(huì)出現(xiàn)一些問題,本文將介紹解決方法,需要的朋友可以了解下2012-11-11
[Oracle] CPU/PSU補(bǔ)丁安裝詳細(xì)教程
Oracle CPU的全稱是Critical Patch Update, Oracle對(duì)于其產(chǎn)品每個(gè)季度發(fā)行一次安全補(bǔ)丁包,通常是為了修復(fù)產(chǎn)品中的安全隱患,以下是對(duì)CPU/PSU補(bǔ)丁安裝的具體操作步驟進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考2013-07-07

