Announcement

Collapse
No announcement yet.

Foreign Key's

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Foreign Key's

    mir ist ein komisches verhalten zum thema foreignkey's aufgefallen:

    wenn ich versuche, mehrere foreignkey zu droppen, (z.b.alter table tab drop constraint fk_tab_1) bekomme ich öfters die fehlermeldung:

    unsuccessfull metadata update object index is in use.

    hat jemand eine ahnung, was diesen fehler verursacht?

  • #2
    Hallo,

    beim Entfernen mehrerer Datenbank-Objekte kommt es darauf an, in welcher Reihenfolge voneinander abhängige Objekte (Stored Procedures, Contraints etc.) gelöscht werden und ob zwischen den einzelnen Schritten COMMIT aufgerufen wird. Von Markus Kemper (InterBase) stammt dazu das folgende Beispiel:
    <pre>
    connect 'oiu.gdb'
    user 'sysdba' password 'masterkey';

    drop database;

    create database 'oiu.gdb'
    user 'sysdba' password 'masterkey';

    set echo on;
    set auto off;

    create table p1 (
    pkey integer not null
    );
    commit;

    create table c1 (
    fkey integer
    );
    commit;

    create table c2 (
    fkey integer
    );
    commit;

    alter table p1 add constraint p1_pkey
    primary key (pkey);
    commit;

    alter table c1 add constraint c1_fkey
    foreign key (fkey) references p1 (pkey);

    alter table c2 add constraint c2_fkey
    foreign key (fkey) references p1 (pkey);
    commit;

    set term ^^;

    create procedure c1_proc
    returns (val integer)
    as
    begin

    for select fkey
    from c1
    where fkey > 0
    into :val
    do
    suspend;
    end^^
    commit^^

    create procedure c2_proc
    returns (val integer)
    as
    begin

    for select fkey
    from c2
    where fkey > 0
    into :val
    do
    suspend;
    end^^
    commit^^

    set term ;^^
    commit;

    drop procedure c2_proc;
    commit;

    /* the drop const. will pass with
    * 'object INDEX in use' because
    * did commit after the drop
    * procedure statement */

    alter table c2 drop constraint c2_fkey;
    commit;

    drop procedure c1_proc;

    /* the drop const. will fail with
    * 'object INDEX in use' because
    * did not commit after the drop
    * procedure statement */

    alter table c1 drop constraint c1_fkey;
    commit;
    </pre&gt

    Comment


    • #3
      Zudem sei bemerkt das InterBase es bei obigen Änderungen manchmal ganz gerne hat, wenn zusätzlich zum Commit auch noch ein Disconnect/connect dazwischen kommt. Insbesondere dann wenn irgendwo ein SchemaChache aktiv ist

      Comment

      Working...
      X