2013-09-23 28 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的评论,谢谢。 –