2013-09-23 66 views
0

我從PL/SQL執行清理操作,這往往會填滿我的重做日誌,導致數據庫凍結在「無法分配新日誌」條件。如何從PL/SQL執行檢查點

將工作拆分成更小的塊不能解決問題,因爲重做日誌文件保持status = ACTIVE和ARCHIVED = YES時間過長。只有在「更改系統檢查點」之後,髒日誌纔會寫入磁盤並在下一個塊中再次可用。

現在,我該如何從PL/SQL做到這一點。我試圖

create procedure cp as begin execute immediate 'alter system checkpoint'; end; 

,但它給了我ORA-01031: insufficient privileges

我已經得到了DBA的角色,但是這不是有效的PL/SQL程序。我需要授予什麼特權?

我知道有控制點檢查的參數,但我不想改變這些。我只想在清理期間手動檢查點。

+1

來自角色的權限在存儲過程內無效。您需要直接授予'alter system'特權。 –

+1

嘗試創建過程cp authid current_user as ...(或者a_horse_with_no_name建議直接向用戶授予) – tbone

+1

對於PL/SQL,角色被禁用,並且通過角色授予的任何特權不適用,除非您使用AUTHID CURRENT_USER創建過程,在這種情況下,角色特權確實適用。 – tbone

回答

1

確保該過程由特權用戶擁有,並將其權限更改爲使用所有者權限運行。

這就好比Unix中的setuid程序。

syntaxCREATE PROCEDURE ... AUTHID DEFINER ...

上面通過@a_horse_with_no_name和@tbone評論的替代方法是授予運行該過程的用戶ALTER SYSTEM權限。

+0

'authid current_user'的作品,但我仍然想知道什麼是特權的名稱 –

+0

AUTHID_DEFINER將是默認的,這意味着角色根本沒有效果,因爲檢查是在編譯時完成的,角色是「軟」 。只有AUTHID CURRENT_USER會在運行時進行授權檢查。 –

+0

TIL所需的權限是「更改系統」。你能不能更新你的答案,包括tbone的評論,謝謝。 –