Process Definition: Trigger on a Child Table

Let's say I have a Process Definition named "Process one" (of type provisioning).
My process contains a task, that has following options set on the 'General' tab
Child Form = 'CHILD_FORM1', trigger type = 'Insert'.
What does it mean?
1) This task conditionally fires when something is inserted into CHILD_FORM1 table or
2) This task performs some actions that are connected with inserting values into CHILD_FORM1 table?

I think if you want to consider an efficient solution, I would look at not implementing your requirements using triggers. If possible consider an API approach where whatever "applicaiton" is being used calls a PL/SQL package that will update both tables if necessary. There are a number of disadvantages to using triggers.
HTH!
Edited by: Centinul on Jan 2, 2009 11:48 PM
Check out this recent thread on triggers: Should one really avoid triggers???

Similar Messages

  • Parent - Child Table Insert Trigger

    Hello,
    I need some help with an Insert Trigger. I want to Insert some field data from 'Table A' to 'Table B' based on a PK and FK. Does anyone have any sample code?
    <code>
    Table A
    SEQ_NO --PK
    FIELD A
    FIELD B
    FIELD C
    Table B
    FK_SEQ_NO
    FIELD B
    FIELD C
    <code>
    When data is saved in 'Table A' I need to populate the 'FK_SEQ_NO' based on the saved value from 'Table A' 'SEQ_NO' along with the FIELD B and FIELD C values saved to Table B.
    Any help is really appreciated, thanks.

    Hi,
    How about this:
    create or replace TRIGGER rmdb_work_packages_biudr_trg
    BEFORE INSERT OR UPDATE OR DELETE ON rmdb_work_packages
    FOR EACH ROW
    DECLARE
      l_module_name          CONSTANT VARCHAR2(100) :=  'tpsdev.rmdb_work_packages_biudr_trg';
    BEGIN
      IF INSERTING THEN
        -- generate a PK sequence if not already set
        IF :new.work_package_id IS NULL THEN
          SELECT rmdb_work_packages_seq.NEXTVAL
          INTO :new.work_package_id
          FROM dual;
        END IF;
        -- populate audit columns
        :NEW.created_by := NVL(v('APP_USER'),user);
        :NEW.creation_date := SYSDATE;
      END IF;
      IF INSERTING OR UPDATING THEN
        IF :new.business_sign_off_flag IS NULL THEN
          -- set the business_sign_off_flag = 'N' if it is null
          :new.business_sign_off_flag := 'N';
        END IF;
        IF :new.at_risk_flag IS NULL THEN
          -- set the at_risk_flag = 'N' if it is null
          :new.at_risk_flag := 'N';
        END IF;
        IF :new.resource_required_flag IS NULL THEN
          -- set the resource_required_flag = 'Y' if it is null
          :new.resource_required_flag := 'N';
        END IF;
        IF :new.contains_patches_flag IS NULL THEN
          -- set the contains_patches_flag = 'Y' if it is null
          :new.contains_patches_flag := 'N';
        END IF;
        -- populate audit columns
        :NEW.last_updated_by := NVL(v('APP_USER'),user);
        :NEW.last_update_date := SYSDATE;
      END IF;
      IF INSERTING THEN
        INSERT INTO RMDB_WP_HISTORY
        WORK_PACKAGE_ID,
        PROJECT_ID,
        SERVICE_ID,
        RELEASE_ID,
        NAME,
        DESCRIPTION,
        COMMENTS,
        WP_TYPE_CODE,
        RESOURCE_REQUIRED_FLAG,
        WP_STATUS_CODE,
        CHANGE_PROBABILITY_CODE,
        CHANGE_IMPACT_CODE,
        APP_USER_ID_OWNER,
        APP_USER_ID_DEPUTY,
        WP_PRIORITY_CODE,
        PRIORITY_JUSTIFICATION,
        REQUIRED_LIVE_DATE,
        BUSINESS_SIGN_OFF_FLAG,
        AT_RISK_FLAG,
        CONTAINS_PATCHES_FLAG,
        PM_REFERENCE,
        MARVAL_NUMBER,
        RCD_NOTES,
        CREATED_BY,
        CREATION_DATE,
        LAST_UPDATED_BY,
        LAST_UPDATE_DATE
        VALUES
       :NEW.WORK_PACKAGE_ID,
       :NEW.PROJECT_ID,
       :NEW.SERVICE_ID,
       :NEW.RELEASE_ID,
       :NEW.NAME,
       :NEW.DESCRIPTION,
       :NEW.COMMENTS,
       :NEW.WP_TYPE_CODE,
       :NEW.RESOURCE_REQUIRED_FLAG,
       :NEW.WP_STATUS_CODE,
       :NEW.CHANGE_PROBABILITY_CODE,
       :NEW.CHANGE_IMPACT_CODE,
       :NEW.APP_USER_ID_OWNER,
       :NEW.APP_USER_ID_DEPUTY,
       :NEW.WP_PRIORITY_CODE,
       :NEW.PRIORITY_JUSTIFICATION,
       :NEW.REQUIRED_LIVE_DATE,
       :NEW.BUSINESS_SIGN_OFF_FLAG,
       :NEW.AT_RISK_FLAG,
       :NEW.CONTAINS_PATCHES_FLAG,
       :NEW.PM_REFERENCE,
       :NEW.MARVAL_NUMBER,
       :NEW.RCD_NOTES,
       :NEW.CREATED_BY,
       :NEW.CREATION_DATE,
       :NEW.LAST_UPDATED_BY,
       :NEW.LAST_UPDATE_DATE  
      END IF;
      IF UPDATING THEN
        INSERT INTO RMDB_WP_HISTORY
        WORK_PACKAGE_ID,
        PROJECT_ID,
        SERVICE_ID,
        RELEASE_ID,
        NAME,
        DESCRIPTION,
        COMMENTS,
        WP_TYPE_CODE,
        RESOURCE_REQUIRED_FLAG,
        WP_STATUS_CODE,
        CHANGE_PROBABILITY_CODE,
        CHANGE_IMPACT_CODE,
        APP_USER_ID_OWNER,
        APP_USER_ID_DEPUTY,
        WP_PRIORITY_CODE,
        PRIORITY_JUSTIFICATION,
        REQUIRED_LIVE_DATE,
        BUSINESS_SIGN_OFF_FLAG,
        AT_RISK_FLAG,
        CONTAINS_PATCHES_FLAG,
        PM_REFERENCE,
        MARVAL_NUMBER,
        RCD_NOTES,
        CREATED_BY,
        CREATION_DATE,
        LAST_UPDATED_BY,
        LAST_UPDATE_DATE
        VALUES
        :NEW.WORK_PACKAGE_ID,
        :NEW.PROJECT_ID,
        :NEW.SERVICE_ID,
        :NEW.RELEASE_ID,
        :NEW.NAME,
        :NEW.DESCRIPTION,
        :NEW.COMMENTS,
        :NEW.WP_TYPE_CODE,
        :NEW.RESOURCE_REQUIRED_FLAG,
        :NEW.WP_STATUS_CODE,
        :NEW.CHANGE_PROBABILITY_CODE,
        :NEW.CHANGE_IMPACT_CODE,
        :NEW.APP_USER_ID_OWNER,
        :NEW.APP_USER_ID_DEPUTY,
        :NEW.WP_PRIORITY_CODE,
        :NEW.PRIORITY_JUSTIFICATION,
        :NEW.REQUIRED_LIVE_DATE,
        :NEW.BUSINESS_SIGN_OFF_FLAG,
        :NEW.AT_RISK_FLAG,
        :NEW.CONTAINS_PATCHES_FLAG,
        :NEW.PM_REFERENCE,
        :NEW.MARVAL_NUMBER,
        :NEW.RCD_NOTES,
        :NEW.CREATED_BY,
        :NEW.CREATION_DATE,
        :NEW.LAST_UPDATED_BY,
        :NEW.LAST_UPDATE_DATE
      END IF;
      IF DELETING THEN
        DELETE FROM RMDB_WP_HISTORY
        WHERE WORK_PACKAGE_ID = :NEW.WORK_PACKAGE_ID;
      END IF;
    END rmdb_work_packages_biudr_trg; There is also a trigger on the child table:
    create or replace TRIGGER RMDB_WP_HISTORY_BIUDR_TRG
    BEFORE INSERT OR UPDATE OR DELETE ON RMDB_WP_HISTORY
    FOR EACH ROW
    BEGIN
      IF INSERTING THEN
        -- generate a PK sequence if not already set
        IF :new.WP_HISTORY_ID    IS NULL THEN
           SELECT RMDB_WP_HISTORY_SEQ.NEXTVAL
           INTO :new.WP_HISTORY_ID
           FROM dual;
        END IF;
      END IF;
    END RMDB_WP_HISTORY_BIUDR_TRG; Does that help?
    Regards,
    Martin

  • Set unique entries in child tables?

    Hi,
    OIM 11g here. I have built a process form with its attached child table for a custom connector i have made. Now i noticed that the child table accepts duplicate entries. How can i make the child table entries unique, as they are in the AD user groups child table?
    thx in advance.

    I have always coded these checks into my custom code whenever i maninuplate child table data. When adding, i always check the existing and when deleting, i always check if the value exists that i'm removing. I would suggest you write a piece of code that does the same and keep it in your library of re-usable code.
    You could try going to the database and making the field for the name a unique field. I don't know what the outcome will be from doing so.
    -Kevin

  • Duplicate Entry in Child Tables in AD Process Form on triggering multipleAP

    hi all,
    I have a scenarion in which I have to provision AD Group Membership, for addition of each role to User.
    so I have created 5 Access policies, 5 roles and mapped AD Group in each access policy.
    The roles are comming from trusted source seperated by a string tokenizer.
    I have java code which will trigger and assign the role memberhsip to user, one after the other. iterating with the string tokenizer(;)
    The problem I see is, I see multiple entries of AD Groups in the process form for each group.
    If I add 3 roles to the user, I am seeing 6 entries in the AD Process form. Duplicate row for each and every row. sometimes i see 3 entries for each row. and 1 entry for each row.
    If I add the role memberships manually, by searching, then I dont see any problem with the AD child form.
    and also If I add a single group membership I dont see any problem with the AD Child form.
    I suspect that the event handler tcEvaluateAccessPolicies which is there in the post update is trying to add the duplicate entries as still the AD Group membership which is triggered for the first time is not yet finished by evaluating the access policies again.
    any such experiences? thoughts? work arounds?
    my oim environment is OIM11.1.1.3.0 on weblogic server.

    I have always coded these checks into my custom code whenever i maninuplate child table data. When adding, i always check the existing and when deleting, i always check if the value exists that i'm removing. I would suggest you write a piece of code that does the same and keep it in your library of re-usable code.
    You could try going to the database and making the field for the name a unique field. I don't know what the outcome will be from doing so.
    -Kevin

  • Task in Process Definition not Running when Trigger Automatically

    Hi All,
    I have created a task in Process Definition (eBusiness Suite User)and attached JAVA code to this task. Also i have triggered this task on C response of Email Updated Task . I also have Change Email Task which is mentioned in Lookup.USR_PROCESS.TRIGGERS lookup defination. so when Email id is changed in OIM Console it is triggering Change email Task and it is getting populate in Process form and as i am using Auto Save Feature .Email Updated task is geting Triggered. and Email is updated in FND_User table.
    Now my Problem is after Email Updated task is completed it is triggering my Task but my Task Is not getting Executed (JAVA code is not executed).
    But when I manually add this task from Resource History , JAVA code is getting Executed .
    What i founf is Email Updated task was triggered by OIMINternal User , So I add in Assignment tab to OIMInternal user , but no luck.
    Task is getting Triggered but is not getting Executed.
    Can any one suggest how i can run this task Automatiically.
    Please help. Its bit urgent.
    Thanks!!
    Regards,
    Tushar

    Once the process tasks has been executed you can not delete it.
    check these links for more info.
    Deleting a Process Task
    Re: Remove Unused Process Tasks from Process Definition for Export

  • Process Task Child Table Delete Event passes empty values

    Hi All,
    I'm trying to implement a delete event in a process task for a child table. I am assuming the value to be deleted
    should be getting passing into the adapter but it's passing empty strings instead. The insert event is working fine however.
    Any one else using the delete event that works?
    Thanx
    Fred

    Hi Kevin.
    Any idea how to programmatically access the "old value" variant of a form field?
    It's the sort of thing one needs occasionally when a value changes and some associated capability needs to be updated. The old value specifies what needs to be removed while the new value tells the system what is to be added in its place.
    (It so happens in our environment that we have dozens of these values per user profile, so it would be very painful to store "old" values in a parallel set of fields.)
    Thanks,
    Dan

  • Parent-child tables

    Hi,
    I have requirement like we have to delete a record called IT_PROG from jobs table.the jobs table have child tables employees,job_history, the employees table act as parent for employees,departments tables.How can i delete all related records using single query or single pl/sql block.
    Thanks in advance,
    Vi

    Hi,
    include it in your original table design would be the best way, with prime key, foreign key constraints and on delete cascade options.
    Other than that utilise trigger logic to coordinate your delete, but the first way is definitely the best, as triggers should be a last resort in databases....
    regards,
    Robert.

  • OIM 11g: Email template - child table columns

    Hi All
    How can I fetch the child table (process form child table) columns in the OOTB email templates. When I select Process form data on the email definition screen on Design console, I am only able to select the main process form's columns.
    Please help. Its urgent.

    OOTB not possible you have to write code for fetching child data.
    I suggest send mail using custom code and fetch child data using OIM APIs.

  • OIM: Getting an error when trying to add entry into child table

    Hi OIM Guru,
    I have a process form and child table I am using for provisionng. Everthing was working so far, but suddenly I am getting the following error whenever I try to add an entry into the child table. I
    Can someone tell me what might be going on here?
    Thanks a lot
    tcFormInstanceOperationsBean/addProcessFormChildData encounter some problems: maoErrors:Cannot schedule a task for child table change, schedule item save failed
    tcFormInstanceOperationsBean/addProcessFormChildData encounter some problems: Cannot schedule a task for child table change, schedule item save failed
    Thor.API.Exceptions.tcAPIException: Cannot schedule a task for child table change, schedule item save failed
    at com.thortech.xl.ejb.beansimpl.tcFormInstanceOperationsBean.addProcessFormChildData(Unknown Source)
    at com.thortech.xl.ejb.beansimpl.tcFormInstanceOperationsBean.addProcessFormChildData(Unknown Source)
    at com.thortech.xl.ejb.beans.tcFormInstanceOperationsSession.addProcessFormChildData(Unknown Source)
    at com.thortech.xl.ejb.beans.tcFormInstanceOperations_2j82mm_EOImpl.addProcessFormChildData(tcFormInstanceOperations_2j82mm_EOImpl.java:1298)
    at com.thortech.xl.ejb.beans.tcFormInstanceOperations_2j82mm_EOImpl_CBV.addProcessFormChildData(Unknown Source)
    at Thor.API.Operations.tcFormInstanceOperationsClient.addProcessFormChildData(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at Thor.API.Base.SecurityInvocationHandler$1.run(Unknown Source)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
    at weblogic.security.Security.runAs(Security.java:41)
    at Thor.API.Security.LoginHandler.weblogicLoginSession.runAs(Unknown Source)

    Never mind. I got it figured out.
    What happened is I changed my adapter that is being called and because of this change the task mappings in Process Definition got wiped out and I had to remap all the attributes again. It now works.
    Whew!! It took me a while to figure this out.
    Thanks

  • Trigger and Update Flag Table

    I've recently started trying to automate around a dozen procedures. These procedures are set to run immediately after the necessary previous procedure(s) is(are) done.
    What I am attempting to accomplish is a single generic trigger that will fire off each procedure when its parent procedures have finished firing. This will be accompanied by an update_flag table with three columns
    PARENT_PRC----------------------CHILD_PRC----------------------FLAG
    parent_prc_name1--------------child_prc_name1-----------------N
    parent_prc_name1--------------child_prc_name2-----------------N
    parent_prc_name3--------------child_prc_name3-----------------Y
    Logic:
    *1.*     When a procedure fires it updates this table to set any rows in which it is the “PARENT_PRC” by updating the FLAG column to = Y.
    *2.*     The trigger will execute a child procedure if its flag (or in the case of multiple parent procedures; all of its flags) are set to 'Y'. This trigger is set to fire AFTER a table update on the UPDATE_FLAG table.
    ----a.     I have to execute the procedure UFLAG in a job because I want the trigger to execute the procedure and then continue running immediately, rather than wait for the procedure to finish then commit. This way the trigger could start several procedures all running at the same time.
    ----b.     I have made it an autonomous transaction because I needed the job to fire immediately rather than be queued, which required a commit within the trigger.
    *3.*     The last step is to set the flag in UPDATE_FLAGS back to 'N' for CHILD_PRC = '||uflag||' once the child procedure is complete.
    ----a.     I have tried placing the update child_prc = 'N' in the trigger but it won’t allow a trigger that fires on update to update the same table.
    ----b.     I want to avoid putting the update statement in all of my procedures because I would like the option of running these procedures manually for testing purposes WITHOUT effecting the update_flags table.
    Number 3. is the key problem I have been having. Placing code within the trigger to update the update_flags table setting 'Y's back to 'N's once the procedures have fired causes a deadlock error.
    I believe this is simply because the trigger is attempting to update a table which (upon updating) causes the same trigger to fire before it has finish executing.
    How can I update the Flag table to reset the update flags back to 'N'?
    Is there a different way of doing this all together?
    Here is some code with dummy procedures that demonstrates what I have so far.
    With this code, executing parent procedures should set the update_flag table to 'Y' for FLAG where procedure = 'parent_prc'.
    I need to find a way to execute the child procedures AND set the FLAG column back to 'N' from the trigger.
    ex. executing parent_1 should set update_flags.flag = 'Y' where parent_prc = 'parent_1' and thus execute procedure CHILD_A and CHILD_B.
    create table update_flags (parent_prc varchar2(10), child_prc varchar2(10), flag varchar2(1));
    insert into update_flags values('parent_1', 'child_a', 'N');
    insert into update_flags values('parent_1', 'child_b', 'N');
    insert into update_flags values('parent_2', 'child_c', 'N');
    insert into update_flags values('parent_3', 'child_c', 'N');
    insert into update_flags values('parent_4', 'child_d', 'N');
    CREATE OR REPLACE procedure parent_1 as
    BEGIN
    update update_flags set flag = 'Y' where parent_prc = 'parent_1';
    END parent_1;
    CREATE OR REPLACE procedure parent_2 as
    BEGIN
    update update_flags set flag = 'Y' where parent_prc = 'parent_2';
    END parent_2;
    CREATE OR REPLACE procedure parent_3 as
    BEGIN
    update update_flags set flag = 'Y' where parent_prc = 'parent_3';
    END parent_3;
    CREATE OR REPLACE procedure parent_4 as
    BEGIN
    update update_flags set flag = 'Y' where parent_prc = 'parent_4';
    END parent_4;
    CREATE OR REPLACE procedure child_a as
    BEGIN
    dbms_output.PUT_LINE('CHILD_A Worked');
    commit;
    END child_a;
    CREATE OR REPLACE procedure child_b as
    BEGIN
    dbms_output.PUT_LINE('CHILD_B Worked');
    commit;
    END child_b;
    CREATE OR REPLACE procedure child_c as
    BEGIN
    dbms_output.PUT_LINE('CHILD_C Worked');
    commit;
    END child_c;
    CREATE OR REPLACE procedure child_d as
    BEGIN
    dbms_output.PUT_LINE('CHILD_D Worked');
    commit;
    END child_d;
    CREATE OR REPLACE TRIGGER MASTER_TRG
    AFTER UPDATE
    ON UPDATE_FLAGS
    DECLARE
    Pragma  AUTONOMOUS_TRANSACTION;
    BEGIN
      DECLARE
      job_num number;
      uflag varchar2(1000);
      BEGIN
            select  MAX(case when COUNT(case when flag='Y' then 1 end)=COUNT(*) then CHILD_PRC else '  ' end)
            into uflag
            from        update_flags
            group by    child_prc;
            IF   uflag <> '  ' THEN
                                      --update update_flags set  flag = 'N' where child_prc = uflag     --(line of code that causes deadlock error)
                            dbms_job.submit (job => job_num,
                            what => ' '||uflag||';'
            END IF; 
       END;            
    COMMIT;
    END MASTER_TRG;
    execute parent_2;
    execute parent_3;

    >
    I think I am getting my head around the transactional/trigger issue.
    >
    It doesn't sound like it since you are still talking 'triggers'. At any rate it is OP that needs to get their head around it.
    OP doesn't even know what the entire process needs to be but has already decided that
    1. a single generic trigger that will fire off each procedure when its parent procedures have finished firing
    2. an update_flag table with three columns: PARENT_PRC, CHILD_PRC, FLAG
    3. a procedure fires it updates this table to set any rows in which it is the “PARENT_PRC” by updating the FLAG column to = Y.
    4. a job - I have to execute the procedure UFLAG in a job
    5. I have made it an autonomous transaction because I needed the job to fire immediately rather than be queued, which required a commit within the trigger.
    6. there should be an option of running these procedures manually for testing purposes WITHOUT effecting the update_flags table.
    Fortunately OP had the wisdom to ask
    >
    Is there a different way of doing this all together?
    >
    Doesn't anyone design things anymore? Seems like everyone just wants to decide what the solution ought to be be and then try to force the problem to fit into it.
    The first stage is the DESIGN - not the implementation details or technology to use.
    The first design step is to outline, or flowchart, the PROCESS that needs to take place. Since OPs post lacks sufficient detail I will substitute my own 'guesstimations' to illustrate.
    1. there are one or more 'parent' processes
    2a. these parent processes are allowed to run in parallel as they do not interfere in any way with the processing done by other parent or child processes. (is this true?)
    2b. these parent processes ARE NOT allowed to run in parallel as they may interfere with each other.
    3. Each parent process can have one or more 'child' processes. (it appears that these aren't really children but rather processes that are 'dependent' on the parent or that must always be executed after, and each time that the parent executes.
    So here are just SOME of the things that are missing that must be known before possible alternatives can be explored
    1. Re item #2 - can the parent processes be executed in parallel? Or must they be executed serially? Will any of the parent processes be dependent on any other parent or child process?
    2. What is the relationship between a parent process and its child processes? Is the parent always executed first? What triggers the parent execution? How often is it executed?
    What if it is already executing? What if other parent processes are currently executing? What if one or more of its child processes are executing? What if the parent process fails for any reason - what action should be taken?
    Based on what was posted a set of parent and child processes might need nothing more than: execute parent, execute child1, execute child2, . . ., execute childn.
    3. What is the relationship between the child processes that belong to the same parent? Can they be executed in parallel (i.e. are they completely independent)? Or must they be executed in some particular order? What if one or more of the child processes fails for any reason - what action should be taken?
    4. Will any other user or process be executing these parent or child processes? That could interfered with the automated stream.
    5. What type of exception handling and recovery needs to be implemented in one or more steps of the processing fail for some reason?
    Typically there is often one or more control tables (OPs flag table) to control and limit the processing. But the table would have status information for every process not just the children:
    A. STATUS - DISABLED, ACTIVE, RUNNING, IDLE, ERROR
    B. START_TIME
    C. END_TIME
    D. RESULT_CODE
    The control table can be used by a parent or child process to determine if it is permitted to run. For example the first thing a procedure might do is check it's own STATUS. If it is already running it would exit or log an error or message. If that test is passed it might check the status of any dependent processes. For example it might check that its child processes are ACTIVE and ready to run; if a child was still running the parent would exit or log an error or message.
    The control process would lock the appropriate control table records (FOR UPDATE) and would set the status and other fields appropriately to prevent interference by other processes or procedures.
    Design first. Then look at the implementation options.

  • Problem with Master and Child table

    Hi,
    Working in jdev 11.1.1.2.0. I have one strange issue. i have master and child tables, the model is working fine with the view link. but when drag drop the same into my jsff. when i query the result 1st time 2 tables are refershing properly and data is coming. but the when i trying to select another row in the 1st table my 2nd table(child table) is not refreshing.
    i put partial trigger of the 2nd table as 1st table id.
    can any one help wht is issue here.
    Edited by: user5802014 on Jul 15, 2010 3:44 PM

    Check this post might help you
    http://baigsorcl.blogspot.com/2010/03/creating-master-detail-form-in-adf.html

  • Insert Record with Parent/Child Tables doesn't work with Oracle - unlike AC

    Hi,
    I just Migrated a MS Access 2010 Database to an Oracle 11g Backend with the SQL Developer Tool.
    The Migration went fine, all the Tables and Views are migrated.
    I'm working with MS Access as Frontend.
    The application has some Datasheets with Subdatasheets with Parent/Child Relationship. (1-n Relationship)
    After changing to Oracle, it's not possible, to Insert a new Record in a Subdatasheet I always get the following Error Message:
    "The Microsoft Access database engine cannot find a record in the table 'xxxx' with key matching field(s) 'zzzzz'"
    It used to work perfect with the MS Access Backend, do I need a trigger which first adds the child Record ?
    Or what should I do?
    Thank you

    Hi Klaus,
    Thanks for your answer. I still haven't solved my problem. The only way would be to use a singel 1:n Relationship, but in fact I need a n:m Relationship.
    I tried the same scenario with a new Access Application, same result.
    To clearify my problem.
    Goal: Parent Form with Parent Records, Linked Child Form with Child Records in a Datasheet View => Insert of a NEW Child Record.
    I have 3 Tables (table1 = Parent tabel, table2 = Child Table, table12 = n:m Tabel with PK and two FK)
    The Recordsource of the Parent Form is Tabel1
    The Recordsource of the Child Form is Table2 joined with Table12.
    In my Old Access Project, Access Triggered the Insert and filled Table12 with the NEW PK of Table2.
    It seems like Access can't do that anymore....
    I'm pretty desperate and I'm sure it is just a litte thing to fix.....

  • How to find the level of each child table in a relational model?

    Earthlings,
    I need your help and I know that, 'yes, we can change'. Change this thread to a answered question.
    So: How to find the level of each child table in a relational model?
    I have a relacional database (9.2), all right?!
         O /* This is a child who makes N references to each of the follow N parent tables (here: three), and so on. */
        /↑\ Fks
       O"O O" <-- level 2 for first table (circle)
      /↑\ Fks
    "o"o"o" <-- level 1 for middle table (circle)
       ↑ Fk
      "º"Tips:
    - each circle represents a table;
    - red tables no have foreign key
    - the table in first line of tree, for example, has level 3, but when 3 becomes N? How much is N? This's the question.
    I started thinking about the following:
    First I have to know how to take the children:
    select distinct child.table_name child
      from all_cons_columns father
      join all_cons_columns child
    using (owner, position)
      join (select child.owner,
                   child.constraint_name fk,
                   child.table_name child,
                   child.r_constraint_name pk,
                   father.table_name father
              from all_constraints father, all_constraints child
             where child.r_owner = father.owner
               and child.r_constraint_name = father.constraint_name
               and father.constraint_type in ('P', 'U')
               and child.constraint_type = 'R'
               and child.owner = 'OWNER') aux
    using (owner)
    where child.constraint_name = aux.fk
       and child.table_name = aux.child
       and father.constraint_name = aux.pk
       and father.table_name = aux.father;Thinking...
    Let's Share!
    My thanks in advance,
    Philips
    Edited by: BluShadow on 01-Apr-2011 15:08
    formatted the code and the hierarchy for readbility

    Justin,
    Understood.
    Nocycle not work in 9.2 and, even that would work, would not be appropriate.
    With your help, I decided a much simpler way (but there is still a small problem, <font color=red>IN RED</font>):
    -- 1
    declare
      type udt_roles is table of varchar2(30) index by pls_integer;
      cRoles udt_roles;
    begin
      execute immediate 'create user philips
        identified by philips';
      select granted_role bulk collect
        into cRoles
        from user_role_privs
       where username = user;
      for i in cRoles.first .. cRoles.count loop
        execute immediate 'grant ' || cRoles(i) || ' to philips';
      end loop;
    end;
    -- 2
    create table philips.root1(root1_id number,
                               constraint root1_id_pk primary key(root1_id)
                               enable);
    grant all on philips.root1 to philips;
    create or replace trigger philips.tgr_root1
       before delete or insert or update on philips.root1
       begin
         null;
       end;
    create table philips.root2(root2_id number,
                               constraint root2_id_pk primary key(root2_id)
                               enable);
    grant all on philips.root2 to philips;
    create or replace trigger philips.tgr_root2
       before delete or insert or update on philips.root2
       begin
         null;
       end;
    create table philips.node1(node1_id number,
                               root1_id number,
                               node2_id number,
                               node4_id number,
                               constraint node1_id_pk primary key(node1_id)
                               enable,
                               constraint n1_r1_id_fk foreign key(root1_id)
                               references philips.root1(root1_id) enable,
                               constraint n1_n2_id_fk foreign key(node2_id)
                               references philips.node2(node2_id) enable,
                               constraint n1_n4_id_fk foreign key(node4_id)
                               references philips.node4(node4_id) enable);
    grant all on philips.node1 to philips;
    create or replace trigger philips.tgr_node1
       before delete or insert or update on philips.node1
       begin
         null;
       end;
    create table philips.node2(node2_id number,
                               root1_id number,
                               node3_id number,
                               constraint node2_id_pk primary key(node2_id)
                               enable,
                               constraint n2_r1_id_fk foreign key(root1_id)
                               references philips.root1(root1_id) enable,
                               constraint n2_n3_id_fk foreign key(node3_id)
                               references philips.node3(node3_id) enable);
    grant all on philips.node2 to philips;
    create or replace trigger philips.tgr_node2
       before delete or insert or update on philips.node2
       begin
         null;
       end;                          
    create table philips.node3(node3_id number,
                               root2_id number,
                               constraint node3_id_pk primary key(node3_id)
                               enable,
                               constraint n3_r2_id_fk foreign key(root2_id)
                               references philips.root2(root2_id) enable);
    grant all on philips.node3 to philips;
    create or replace trigger philips.tgr_node3
       before delete or insert or update on philips.node3
       begin
         null;
       end;                          
    create table philips.node4(node4_id number,
                               node2_id number,
                               constraint node4_id_pk primary key(node4_id)
                               enable,
                               constraint n4_n2_id_fk foreign key(node2_id)
                               references philips.node2(node2_id) enable);
    grant all on philips.node4 to philips;
    create or replace trigger philips.tgr_node4
       before delete or insert or update on philips.node4
       begin
         null;
       end;                          
    -- out of the relational model
    create table philips.node5(node5_id number,
                               constraint node5_id_pk primary key(node5_id)
                               enable);
    grant all on philips.node5 to philips;
    create or replace trigger philips.tgr_node5
       before delete or insert or update on philips.node5
       begin
         null;
       end;
    -- 3
    create table philips.dictionary(table_name varchar2(30));
    insert into philips.dictionary values ('ROOT1');
    insert into philips.dictionary values ('ROOT2');
    insert into philips.dictionary values ('NODE1');
    insert into philips.dictionary values ('NODE2');
    insert into philips.dictionary values ('NODE3');
    insert into philips.dictionary values ('NODE4');
    insert into philips.dictionary values ('NODE5');
    --4
    create or replace package body philips.pck_restore_philips as
      procedure sp_select_tables is
        aExportTablesPhilips     utl_file.file_type := null; -- file to write DDL of tables   
        aExportReferencesPhilips utl_file.file_type := null; -- file to write DDL of references
        aExportIndexesPhilips    utl_file.file_type := null; -- file to write DDL of indexes
        aExportGrantsPhilips     utl_file.file_type := null; -- file to write DDL of grants
        aExportTriggersPhilips   utl_file.file_type := null; -- file to write DDL of triggers
        sDirectory               varchar2(100) := '/app/oracle/admin/tace/utlfile'; -- directory \\bmduhom01or02 
        cTables                  udt_tables; -- collection to store table names for the relational depth
      begin
        -- omits all referential constraints:
        dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'REF_CONSTRAINTS', false);
        -- omits segment attributes (physical attributes, storage attributes, tablespace, logging):
        dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SEGMENT_ATTRIBUTES', false);
        -- append a SQL terminator (; or /) to each DDL statement:
        dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true);
        -- create/open files for export DDL:
        aExportTablesPhilips := utl_file.fopen(sDirectory, 'DDLTablesPhilips.pdc', 'w', 32767);
        aExportReferencesPhilips := utl_file.fopen(sDirectory, 'DDLReferencesPhilips.pdc', 'w', 32767);
        aExportIndexesPhilips := utl_file.fopen(sDirectory, 'DDLIndexesPhilips.pdc', 'w', 32767);
        aExportGrantsPhilips := utl_file.fopen(sDirectory, 'DDLGrantsPhilips.pdc', 'w', 32767);
        aExportTriggersPhilips := utl_file.fopen(sDirectory, 'DDLTriggersPhilips.pdc', 'w', 32767);
        select d.table_name bulk collect
          into cTables -- collection with the names of tables in the schema philips
          from all_tables t, philips.dictionary d
         where owner = 'PHILIPS'
           and t.table_name = d.table_name;
        -- execution
        sp_seeks_ddl(aExportTablesPhilips,
                     aExportReferencesPhilips,
                     aExportIndexesPhilips,
                     aExportGrantsPhilips,
                     aExportTriggersPhilips,
                     cTables);
        -- closes all files
        utl_file.fclose_all;
      end sp_select_tables;
      procedure sp_seeks_ddl(aExportTablesPhilips     in utl_file.file_type,
                             aExportReferencesPhilips in utl_file.file_type,
                             aExportIndexesPhilips    in utl_file.file_type,
                             aExportGrantsPhilips     in utl_file.file_type,
                             aExportTriggersPhilips   in utl_file.file_type,
                             cTables                  in out nocopy udt_tables) is
        cDDL       clob := null; -- colletion to save DDL
        plIndex    pls_integer := null;
        sTableName varchar(30) := null;
      begin
        for i in cTables.first .. cTables.count loop
          plIndex    := i;
          sTableName := cTables(plIndex);
           * Retrieves the DDL and the dependent DDL into cDDL clob       *      
          * for the selected table in the collection, and writes to file.*
          begin
            cDDL := dbms_metadata.get_ddl('TABLE', sTableName, 'PHILIPS');
            sp_writes_ddl(aExportTablesPHILIPS, cDDL);
          exception
            when dbms_metadata.object_not_found then
              null;
          end;
          begin
            cDDL := dbms_metadata.get_dependent_ddl('REF_CONSTRAINT', sTableName, 'PHILIPS');
            sp_writes_ddl(aExportReferencesPhilips, cDDL);
          exception
            when dbms_metadata.object_not_found2 then
              null;
          end;
          begin
            cDDL := dbms_metadata.get_dependent_ddl('INDEX', sTableName, 'PHILIPS');
            sp_writes_ddl(aExportIndexesPhilips, cDDL);
          exception
            when dbms_metadata.object_not_found2 then
              null;
          end;
          begin
            cDDL := dbms_metadata.get_dependent_ddl('OBJECT_GRANT', sTableName, 'PHILIPS');
            sp_writes_ddl(aExportGrantsPhilips, cDDL);
          exception
            when dbms_metadata.object_not_found2 then
              null;
          end;
          begin
            cDDL := dbms_metadata.get_dependent_ddl('TRIGGER', sTableName, 'PHILIPS');
            sp_writes_ddl(aExportTriggersPhilips, cDDL);
          exception
            when dbms_metadata.object_not_found2 then
              null;
          end;
        end loop;
      end sp_seeks_ddl;
      procedure sp_writes_ddl(aExport in utl_file.file_type,
                              cDDL    in out nocopy clob) is
        pLengthDDL  pls_integer := length(cDDL);
        plQuotient  pls_integer := null;
        plRemainder pls_integer := null;
      begin
          * Register variables to control the amount of lines needed   *
         * for each DDL and the remaining characters to the last row. *
        select trunc(pLengthDDL / 32766), mod(pLengthDDL, 32766)
          into plQuotient, plRemainder
          from dual;
          * Join DDL in the export file.                            *
         * ps. 32766 characters + 1 character for each line break. *
        -- if the size of the DDL is greater than or equal to limit the line ...
        if plQuotient >= 1 then
          -- loops for substring (lines of 32766 characters + 1 break character):
          for i in 1 .. plQuotient loop
            utl_file.put_line(aExport, substr(cDDL, 1, 32766));
            -- removes the last line, of clob, recorded in the buffer:
            cDDL := substr(cDDL, 32767, length(cDDL) - 32766);
          end loop;
        end if;
          * If any remains or the number of characters is less than the threshold (quotient = 0), *
         * no need to substring.                                                                 *
        if plRemainder > 0 then
          utl_file.put_line(aExport, cDDL);
        end if;
        -- record DDL buffered in the export file:
        utl_file.fflush(aExport);
      end sp_writes_ddl;
    begin
      -- executes main procedure:
      sp_select_tables;
    end pck_restore_philips;<font color="red">The problem is that I still have ...
    When creating the primary key index is created and this is repeated in the file indexes.
    How to avoid?</font>

  • Cascade update of primary key in child tables

    Hi,
    We have a typical scenario in which the primary key has to propage to the child table into 3 levels. We are getting the no parent key exception if we create new data into the three tables using 3 level master detail relationship and execute commit operation. The following is the structure of the tables.
    Parent_table (sno number primary key, name varchar2(100));
    Child_table (fk_sno number primary key, name varchar2(100), foreign key (fk_sno) references parent_table(sno));
    GrandChild_table (sno number primary key, fk_sno number, name varchar2(100), foreign key (fk_sno) references Child_table(fk_sno));
    The requirement is to update fk_sno in child_table and grandchild_table with the trigger generated primary key sno in the parent_table.
    The application module is having the following structure
    parenttable
    |
    ----------childtable
    |
    -----------grandchild_table
    If we create new records into parent_table and child_table it is working fine when we commit the data. If we create another record into grandchild_table and commit data we are getting the foreign key violation exception. We are using composition in the association to update the modified values to refresh the data.
    Is there any problem in the data model to use fk_sno as primary key and foreign key in child_table.
    Thanks and Regards,
    S R Prasad

    Hmm, another example is CSKS, this logic was probably designed already in the 1980s...maybe it was seen beneficial to be able to select the currently valid record by using the primary key only (the first record where DATBI is larger than system date, not possible when DATAB is the key instead).
    Maybe there are better explanations. Why do you need to know this, just curious?
    Thomas

  • Update column data to Upper Case in parent and child table

    Hi ,
    I am facing issue while updating column value to upper case in parent table and child table. How can i do that ?
    when updating parent row:
    ORA-02292: integrity constraint (XXXXXXXXXXXXXX_FK) violated - child record found
    When updatng corresponding child row:
    ORA-02291: integrity constraint (XXXXXXXXXXXXXXXX_FK) violated - parent key not found
    how can i update on both the places ?
    Regards,
    AA

    I am facing issue while updating column value to upper case in parent table and child table. How can i do that ?
    Why do you need to do that?
    That is just ONE of several questions you should answer before you start modifying your data.
    1. What is your 4 digit Oracle version? (result of SELECT * FROM V$VERSION)
    2. If both values are the same case what difference does it make what that case is?hen you don't need to alter your original data.
    3. What is the source of the column values you are using now? If you change your data to upper case it will no longer be identical to the source data.
    4. What is your plan for enforcing future values to be stored in UPPER case? Are you going to use a trigger? Have you written and tested such a trigger to see if it will even work the way you expect?
    5. Why aren't you using a surrogate key instead of a 'business' data item? You have just demonstrated one reason why surrogate keys can be useful: their actual value is NOT important.
    You should reexamine your problem and architecture and consider other alternatives.
    One alternative is to add a new 'surrogate key' column to use as the primary key. Just create a new sequence and use a trigger to populate the new column. Your current plans will require a trigger to perform the case conversion so instead of the just use the trigger to provide the value.
    If the change is being done to facilitate searching you could just add a VIRTUAL column UPPER_MY_COLUMN and index that instead. Then you could search on that new virtual column and the data values would still be identical to the original data source.

Maybe you are looking for

  • Error while installing NW '04 SR1

    Hi all, I have installed java 1.4.2_07 and Oracle 9.2. Then when I try to install NW'04 SR1 J2EE installation, I get the following error at phase 2 (of 34) i.e. <i>SAP System Installation</i>::::: <b>ERROR 2005-07-21 18:56:06 FSL-00001  System call f

  • Using a custom login page for the portal

    Hi all, I'm currently doing a migration from Plumtree 4.5WS to Plumtree 5.0.4. In the current 4.5WS portal, I'm catering to 3 different login mechanisms due to time-lags in migration of my users' workstations. The 3 mechanisms are: 1) Smart Card Read

  • Lightroom Or Photoshop Elements 9

    I am an amateur photographer and have used Photoshop Elements for a number of years. I currently have version 7 and I find the program extremely cumbersome and not intuitive. I know I should spend more time learning the program but what I am looking

  • Need to use Formula to add a formula

    Hello Experts, In one of the requirement, I wrote a formula to calculate Level  from the Hierarchy of a particular Dimension. Now, I need to prompt user input for the 'Level' and filter the report comparing "Prompt Level" and "Calculated Level". Im g

  • Mountain Lion and AppleWorks 6.22 ... will Appleworks still work in this ??  I'm used to it and like it ..... but would like Mountain Lion very much

    does anyone know if you can use an old program like APPLEWORKS 6.22 and ADOBE ILLUSTRATOR 10 with the new MOUNTAIN LION.... I am very fond of my old programs and like them and don't want to loose them ......  OS 10.6.8 still accepts APPLEWORKS and al