Firebird törlés előtt ellenőrzés

Firebird törlés előtt ellenőrzés
2007-04-10T16:54:12+02:00
2007-04-14T09:49:41+02:00
2022-11-04T05:50:47+01:00
csuri
Firebird 2.0

Az lenne a kérdés, hogy lehet e ellenőrizni valahogy azt, hogy egy adott tábla adott sora törolhető e, vagy az adatbázisban létező foreign key-ek ezt nem engedik?

Konkrétan arra lenne szükségem, hogy a vizsgált sorra van e már hivatkozás más táblában.
Mutasd a teljes hozzászólást!
Hátha ez segít:

Egy SQL ami visszaadja a tábla mezőit, indexet, és a foreign key-eket.


This query will tell you TableName, FieldName, FieldType, FieldSubType, ForeignTableName, ForeignFieldName select distinct Rel.rdb$relation_name TableName, Rel.rdb$field_name FieldName, Fld.rdb$field_type FieldType, Fld.rdb$field_sub_type FieldSubType, FCon.rdb$Relation_Name ForeignTableName, FIseg.rdb$Field_Name ForeignFieldName from rdb$relation_fields Rel left join rdb$relation_constraints Con on (Con.rdb$relation_name = Rel.rdb$relation_name and Con.rdb$constraint_type like 'FOREIGN%') left join rdb$indices IDX on IDX.rdb$index_name = Con.rdb$index_name left join rdb$index_segments ISeg on (ISeg.rdb$index_name = Idx.rdb$index_name and ISeg.rdb$Field_Name = Rel.rdb$field_name) left join rdb$Relation_Constraints FCon on FCon.rdb$index_name = Idx.rdb$Foreign_Key left join rdb$index_segments FIseg on (FISeg.rdb$index_name = Idx.rdb$Foreign_key and FISeg.rdb$Field_Position = ISeg.rdb$Field_Position), rdb$fields Fld, rdb$Relation_Fields RFld where Rel.rdb$relation_name not like 'RDB$%' and Fld.rdb$field_name = Rel.rdb$field_source and RFld.rdb$Relation_Name = Rel.rdb$Relation_name and RFld.rdb$field_name = Rel.rdb$field_name order by Rel.rdb$relation_name, RFld.rdb$Field_ID;
Mutasd a teljes hozzászólást!

  • Valamelyik rendszertáblában biztos benne van (nézegesd azokat!), hogy mely táblák hivatkoznak rá
    FK
    -val... Ha pedig már konkrétan tudod, akkor egy (vagy több) egyszerű lekérdezéssel ellenőrizheted! Én mindenesetre azt csinálnám, hogyha törölni kell, akkor törlöm. Ha nem sikerül, akkor azt a kivétel úgyis jelzi...
    Mutasd a teljes hozzászólást!
  • Igen, ez a megoldás jó, de nagyon nehézkes, ezért próbálkoztam, hátha valaki tud rá egy Firebird SQL utasítást már készen.

    Amúgy pont az a lényeg, hogy nem törölni akarom, hanem azt elérni, hogy egy tárolt eljárásban ellenőrizni, hogy van e az adott sorra hivatkozás. Mert ha nincs, akkor UPDATE megy az adott sorra, ha viszont már van rá hivatkozás, akkor a mostani értékek egy INSERT-el új sorban kerülnének a táblába.
    Mutasd a teljes hozzászólást!
  • Ha tudod, hogy mely táblákban keresd a hivatkozásokat, akkor a legjobb helye az ellenőrzésnek a törlés előtti trigger, mivel ez automatikusan lefut, nem kell meghívnod sem:

    SET TERM ^ ; CREATE TRIGGER TRG_Ellenor FOR <táblaneve> ACTIVE BEFORE DELETE POSITION 0 // törlé előtt elsőként fut le AS BEGIN DECLARE @v1 INTEGER DECLARE @v2 INTEGER ... SELECT @v1 = Count(*) FROM <hivatkozó tábla> WHERE <azonosito> = <főtábla azonosító>; SELECT @v2 = Count(*) FROM <hivatkozó tábla2> WHERE <azonosito> = <főtábla azonosító>; ... IF @v1+@v2+... > 0 // van rá hivatkozás!!! ELSE // nincs rá hivatkozás. END ^
    Mutasd a teljes hozzászólást!
  • A gond pont az, hogy dinamikusan kellene megtalálnom ezeket, sajnos nem tudom biztosítani másképpen az adatbiztonságot.
    Mutasd a teljes hozzászólást!
  • Az RDB$RELATION_CONSTRAINTS táblában nézzél szét.

    [szerk]
    Ehhez a View menüben (IBConsole) be kell kapcsolni a View menü System Data opcióját.
    [/szerk]
    Mutasd a teljes hozzászólást!
  • Hátha ez segít:

    Egy SQL ami visszaadja a tábla mezőit, indexet, és a foreign key-eket.


    This query will tell you TableName, FieldName, FieldType, FieldSubType, ForeignTableName, ForeignFieldName select distinct Rel.rdb$relation_name TableName, Rel.rdb$field_name FieldName, Fld.rdb$field_type FieldType, Fld.rdb$field_sub_type FieldSubType, FCon.rdb$Relation_Name ForeignTableName, FIseg.rdb$Field_Name ForeignFieldName from rdb$relation_fields Rel left join rdb$relation_constraints Con on (Con.rdb$relation_name = Rel.rdb$relation_name and Con.rdb$constraint_type like 'FOREIGN%') left join rdb$indices IDX on IDX.rdb$index_name = Con.rdb$index_name left join rdb$index_segments ISeg on (ISeg.rdb$index_name = Idx.rdb$index_name and ISeg.rdb$Field_Name = Rel.rdb$field_name) left join rdb$Relation_Constraints FCon on FCon.rdb$index_name = Idx.rdb$Foreign_Key left join rdb$index_segments FIseg on (FISeg.rdb$index_name = Idx.rdb$Foreign_key and FISeg.rdb$Field_Position = ISeg.rdb$Field_Position), rdb$fields Fld, rdb$Relation_Fields RFld where Rel.rdb$relation_name not like 'RDB$%' and Fld.rdb$field_name = Rel.rdb$field_source and RFld.rdb$Relation_Name = Rel.rdb$Relation_name and RFld.rdb$field_name = Rel.rdb$field_name order by Rel.rdb$relation_name, RFld.rdb$Field_ID;
    Mutasd a teljes hozzászólást!
  • Firebird törlés előtt ellenőrzés


    vs.

    pont az a lényeg, hogy nem törölni akarom




    Lehet, hogy topic-cím változtatást kellene eszközölni...
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd