Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL触发器:can';创建apex用户_Sql_Database_Oracle_Plsql_Oracle Apex - Fatal编程技术网

PL/SQL触发器:can';创建apex用户

PL/SQL触发器:can';创建apex用户,sql,database,oracle,plsql,oracle-apex,Sql,Database,Oracle,Plsql,Oracle Apex,我正在处理一个数据库,最后剩下的任务之一是创建用户帐户。由于某种原因,我似乎无法让它工作。事实上,没有注释的代码在未注释时可以工作。我们主要关心的是能够自动创建用户帐户,而不是手动创建。我希望有人能对我的错误有所了解,这样我的代码就可以编译了 create or replace TRIGGER trg_Students BEFORE INSERT OR UPDATE OF SRN, Surname, Forename, Username, DOB, Date_Cv_Submitted, Date

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

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;
现在它产生了这个错误:

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

请与您的应用程序管理员联系


不能直接从PLSQL执行create语句

将此更改为:

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

   execute immediate 'CREATE USER '||:new.USERNAME ||'
                      IDENTIFIED BY PASSWORD
                      PROFILE app_user
                      PASSWORD EXPIRE';

不能直接从PLSQL执行create语句

将此更改为:

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

   execute immediate 'CREATE USER '||:new.USERNAME ||'
                      IDENTIFIED BY PASSWORD
                      PROFILE app_user
                      PASSWORD EXPIRE';

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

   APEX_UTIL.CREATE_USER(
   p_user_name => :new.USERNAME,
   P_web_password => 'Password123',
   p_change_password_on_first_use => 'Y');
通过在application builder中更改安全设置以允许api工作,解决了上面的错误。下面的代码可以找到此错误。
Application Builder->(您的应用程序)->共享组件->安全属性,最后在页面底部的运行时API用法旁边的框中打勾,我根据需要全部打勾。

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

   APEX_UTIL.CREATE_USER(
   p_user_name => :new.USERNAME,
   P_web_password => 'Password123',
   p_change_password_on_first_use => 'Y');
通过在application builder中更改安全设置以允许api工作,解决了上面的错误。下面的代码可以找到此错误。
应用程序生成器->(您的应用程序)->共享组件->安全属性,最后在页面底部运行时API用法旁边的框中打勾,我根据需要全部打勾。

为了在触发器内提交,您必须为自治事务设置触发器

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

HTH

为了在触发器中提交,您必须为自治事务设置触发器

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

HTH

1发生错误ORA-04092:无法在触发器中提交ORA-06512:位于“APEX514.TRG_STUDENTS”,第6行ORA-04088:执行触发器“APEX514.TRG_STUDENTS”Matt时出错-请参阅关于PRAGMA AUTONOMOUS_事务的最新响应,以希望解决您的提交问题。出现1个错误ORA-04092:无法在触发器中提交ORA-06512:位于“APEX514.TRG_STUDENTS”,第6行ORA-04088:执行触发器“APEX514.TRG_STUDENTS”Matt时出错-请参阅有关PRAGMA Autonomy_事务的最新响应,以期解决您的提交问题。谢谢,您可能为我节省了很多时间。谢谢,您可能为我节省了很多时间。