【问题标题】:PL/SQL trigger: can't create apex userPL/SQL 触发器:无法创建顶点用户
【发布时间】:2015-11-06 13:21:08
【问题描述】:

我正在处理数据库,剩下的最后一项任务是创建用户帐户。出于某种原因,我似乎无法让它工作。事实上,没有注释的代码在未注释时都不起作用。我们主要关心的是能够自动创建用户帐户,而不是手动创建它们。我希望有人能对我的方法中的错误有所了解,以便我的代码能够编译。

create or replace TRIGGER trg_Students
BEFORE INSERT OR UPDATE OF SRN, Surname, Forename, Username, DOB, Date_Cv_Submitted, Date_cv_approved, same_address, home_phone_no, home_postcode ON Students 
FOR EACH ROW
BEGIN

IF INSERTING THEN
   :NEW.SRN := seq_SRN.nextval;

   CREATE USER :new.USERNAME
   IDENTIFIED BY PASSWORD
   PROFILE app_user
   PASSWORD EXPIRE;

    --IF (ACTIVE_ACCOUNT = 'Y' AND CV_APPROVED = NULL) THEN
    --    RAISE_APPLICATION_ERROR(-20000, 'Cannot create an account that is active before the cv is approved!');
    --END IF;        

END IF; 

--IF UPDATING THEN
    --IF (DATE_CV_APPROVED != NULL) THEN
    --:new.Active_Account := 'Y';
    --END IF;
--END IF;

:NEW.forename := INITCAP(:NEW.forename);
:NEW.surname := INITCAP(:NEW.surname);

:NEW.home_postcode := UPPER(:NEW.home_postcode);

:NEW.home_phone_no := REGEXP_REPLACE(:NEW.home_phone_no, '[^[:digit:]]', '');
:NEW.home_phone_no := REGEXP_REPLACE(:NEW.home_phone_no,
                   '([[:digit:]]{5})([[:digit:]]{6})', '(\1) \2');


IF :NEW.same_address = 'Y' THEN
:NEW.term_no := :NEW.home_no;
:NEW.term_postcode := :NEW.home_postcode;
:NEW.term_phone_no := :NEW.home_phone_no;
ELSE
:NEW.term_postcode := UPPER(:NEW.term_postcode);
:NEW.term_phone_no := REGEXP_REPLACE(:NEW.term_phone_no, '[^[:digit:]]', '');
:NEW.term_phone_no := REGEXP_REPLACE(:NEW.term_phone_no,
                   '([[:digit:]]{5})([[:digit:]]{6})', '(\1) \2');
END IF;


IF (:NEW.DOB + NUMTOYMINTERVAL(18,'YEAR') > SYSDATE) THEN
    RAISE_APPLICATION_ERROR(-20000, 'Client must be at least 18 years of age!');
END IF;

IF (:NEW.Date_cv_approved < :NEW.date_cv_submitted) THEN
    RAISE_APPLICATION_ERROR(-20000, 'Cannot approve a cv before it is submitted!');
END IF; 

END;

错误是

编译失败,第 6 行 (13:19:44) 与关联的行号 编译错误与第一个 BEGIN 语句有关。这 只影响数据库触发器的编译。 PLS-00103: 在预期以下情况之一时遇到符号“CREATE”:( begin case declare else elsif end exit for goto if loop mod null pragma raise return select update while with

我已将方法更改为:

   APEX_UTIL.CREATE_USER(
   p_user_name => :new.USERNAME,
   P_web_password => 'Password123');

现在它会产生这个错误:

API 调用已被禁止。请联系您的管理员。细节 有关此事件的信息可通过调试 ID“46046”获得。

联系您的应用程序管理员。

【问题讨论】:

    标签: sql database oracle plsql oracle-apex


    【解决方案1】:

    我回答自己的问题似乎很有趣,但我解决了这个问题。我用来创建 apex 用户的代码如下。

       APEX_UTIL.CREATE_USER(
       p_user_name => :new.USERNAME,
       P_web_password => 'Password123',
       p_change_password_on_first_use => 'Y');
    

    通过从应用程序构建器中更改安全设置以允许 api 工作,解决了上述错误,这是由以下发现的。 应用程序生成器->(您的应用程序)-> 共享组件-> 安全属性,最后勾选页面底部运行时 API 使用旁边的框,我根据需要勾选了所有 3 个。

    【讨论】:

    • 谢谢你,你可能为我节省了很多时间。
    【解决方案2】:

    您不能直接从 PLSQL 执行创建语句。

    将其更改为:

    IF INSERTING THEN
       :NEW.SRN := seq_SRN.nextval;
    
       execute immediate 'CREATE USER '||:new.USERNAME ||'
                          IDENTIFIED BY PASSWORD
                          PROFILE app_user
                          PASSWORD EXPIRE';
    

    【讨论】:

    • 发生 1 个错误 ORA-04092:无法在触发器中提交 ORA-06512:在“APEX514.TRG_STUDENTS”第 6 行 ORA-04088:执行触发器“APEX514.TRG_STUDENTS”时出错跨度>
    • Matt - 查看有关 PRAGMA AUTONOMOUS_TRANSACTION 的最新回复,希望能解决您的 COMMIT 问题。
    【解决方案3】:

    您必须为自治事务设置触发器才能在触发器内提交。

    CREATE TRIGGER your_trigger
       BEFORE INSERT ON your_table FOR EACH ROW
    DECLARE
       PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    ...
    

    HTH

    【讨论】:

      猜你喜欢
      • 2018-04-01
      • 1970-01-01
      • 2013-06-03
      • 2014-10-14
      • 1970-01-01
      • 2018-05-24
      • 2012-01-04
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多