有个要求,当往一个表中输入数据的时候,触发器自动的创建和加入数据对应的用户。我开始时在触发器中创建用户的,但是因为不能在触发器中有commit或者rollback之类的动作,所以把创建用户的动作写为了一个存储过程,但是,还是有问题,提示权限不够。各位有明白的给个答案啊。很着急的。 
附代码: 
触发器的代码: 
create or replace trigger INST_OCT_ACC_PRSN_TR 
  after insert or update or delete on oct_acc_prsn   
  for each row 
declare 
  instID varchar2(50); 
  sqlText1 varchar2(200); 
  sqlText2 varchar2(200); 
begin 
    if inserting then 
        instID := trim(:new.prsn_lg_id); 
        if instID IS NOT NULL THEN 
           OCT_ACC_PRSN_PR(instID,instID);        
        end if; 
    end if; 
end INST_OCT_ACC_PRSN_TR; 
存储过程的代码: 
create or replace procedure OCT_ACC_PRSN_PR(userName varchar2, userPW varchar2) authid current_user is pragma autonomous_transaction; 
begin 
     declare 
         sqlText1 varchar2(200); 
         sqlText2 varchar2(200); 
     begin 
         sqlText1 := 'create user '  ¦ ¦ userName  ¦ ¦ ' identified by '  ¦ ¦ userPW ; 
         sqlText2 := 'grant connect to '  ¦ ¦ userName; 
         execute immediate sqlText1; 
         execute immediate sqlText2; 
     end; 
end OCT_ACC_PRSN_PR; 
现在这种写法会报出ora-01031的错误。请大家给个解决方法。谢谢了!好着急呀。
如果是权限不够的话,我把存储过程中的用户名和密码都写成固定的值,单纯执行存储过程,是可以创建用户的。这个怎么解释呢?

解决方案 »

  1.   

    想要在存储过程中创建用户,你就必须为你当前的用户赋予create user的权限而不是使用你当前用户被赋予的角色中的权限。因为存储过程不能使用角色中的权限。
    是不是这个问题呢?
    或者是你的trigger没有执行存储过程的权限。
    总之查一下权限和角色的赋予情况再说吧。
      

  2.   

    首先你调用触发器的用户应该具有create user 权限,connect也必须时grantable,否则会报错;
    我试过了,可以创建用户和赋予权限;我调用触发器的用户具有以下权限,你赋予这些权限试试看
    connect Y Y
    dba Y Y
    resource Y Y
    create user N
    grant any object privilege N
    unlimited tablespace Y