Forum Delphi.cz

Databáze => Firebird a Interbase => Téma založeno: Stanislav Hruška 20-06-2018, 13:54:37

Název: Trigget - After Insert -> INSERT INTO
Přispěvatel: Stanislav Hruška 20-06-2018, 13:54:37
Kód: [Vybrat]
SET TERM ^ ;
CREATE TRIGGER DAY_COST_LFS_AI FOR DAY_COST_LFS
ACTIVE AFTER
  INSERT
POSITION 0
AS
BEGIN
  INSERT INTO Z_DAY_COST_LFS
    SELECT *
/*FKLANDLORD_FLAT, FKSERVICEPARAMETERS, FKCAANALYTICOPTIONS, FKSUBACCOUNTS, KINDENERGY, PRICEUNIT_VAT, DEPOSIT,
PAY, BILLING, DATEFROM, DATETO, DAYS*/
    FROM DAY_COST_LFS;
END^
SET TERM ; ^
DAY_COST_LFS je GTT. Vkladám do nej 619 záznamov. Tabuľka Z_DAY_COST_LFS je prázdna aj keď vymenujem všetky polia. Netuším kde je chyba.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: Stanislav Hruška 20-06-2018, 13:59:11
Moja chyba. Zablokoval som si funkciu. Po odblokovaní mi to tam vloží 191 890 záznamov.
Otázku mením: prečo tak veľa.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: Stanislav Hruška 20-06-2018, 14:08:57
Už mi došlo prečo. Zakaždým sa tam vloží obsah celej tabuľky.
Ja tam potrebujem vložiť buď vždy len aktuálny riadok, alebo len raz celú tabuľku. Momentálne neviem ani jedno ani druhé.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: Stanislav Hruška 20-06-2018, 14:15:54
Hm, vidím to na vloženie pomocného poľa do ktorého si budem ukladať hodnoty z generátora. A tá hodnota z generátora pôjde do podmienky.
To je nejaké krkolomné.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: KarelHorky 20-06-2018, 14:16:45
Insert pro aktuální řádek uvnitř trigru uděláš s pomocí alias "new":

INSERT INTO Z_DAY_COST_LFS (FKLANDLORD_FLAT)
VALUES (new.FKLANDLORD_FLAT);

Nahraď si svůj insert za tento a ostatní sloupce si doplň podle potřeby.
KH.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: Stanislav Hruška 20-06-2018, 14:20:32
Vďaka, už to ide ako má. Ja som ten new použil, ale v tom selecte :-[  Ide to aj bez vymenovania polí v časti INSERT INTO. Nerobím tým chybu?
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: pf1957 20-06-2018, 14:45:55
Vďaka, už to ide ako má. Ja som ten new použil, ale v tom selecte :-[  Ide to aj bez vymenovania polí v časti INSERT INTO. Nerobím tým chybu?
Nevim, jak je pravdepodobne, ze se ti zmeni fyzicke poradi sloupcu v GTT a te parove trvale tabulce. Pokud ano, bude odkaz * delat pic*viny. Ja to pri replikaci mezi ruznymi DB, kde jsem nechtel z duvodu silene udrzby v kazdem triggeru vypisovat pole, pouzil *, ale pak jsem musel setridit sloupce v DB. A beda, kdyz na to admin pri upgradu u zakaznika zapomel :-)
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: Delfin 20-06-2018, 14:48:43
Nevim, jak je pravdepodobne, ze se ti zmeni fyzicke poradi sloupcu v GTT a te parove trvale tabulce. Pokud ano, bude odkaz * delat pic*viny. Ja to pri replikaci mezi ruznymi DB, kde jsem nechtel z duvodu silene udrzby v kazdem triggeru vypisovat pole, pouzil *, ale pak jsem musel setridit sloupce v DB. A beda, kdyz na to admin pri upgradu u zakaznika zapomel :-)

Nejen to. Da se to vubec napsat? Neco jako:

Kód: MySQL [Vybrat]
  1. INSERT INTO MyTable
  2. SELECT new.*;
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: vandrovnik 20-06-2018, 14:51:20
S tou hvězdičkou bych to vůbec nepokoušel - něco mi říká, že pokud by někdy použil nějaké počítané pole (COMPUTED BY...), tak to stejně nebude fungovat.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: Stanislav Hruška 20-06-2018, 14:54:49
S tou hviezdičkou som to mal. A ako som písal vyššie, vždy mi to vložilo celú aktuálnu tabuľku. Výsledok bol 191 890 namiesto 619 záznamov.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: vandrovnik 20-06-2018, 14:55:55
S tou hviezdičkou som to mal. A ako som písal vyššie, vždy mi to vložilo celú aktuálnu tabuľku. Výsledok bol 191 890 namiesto 619 záznamov.

Za to nemohla hvězdička, ale to, že po insertu každého záznamu došlo ke zkopírování všech už dosud vložených záznamů :-)
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: Stanislav Hruška 20-06-2018, 14:56:44
Citace
Nevim, jak je pravdepodobne, ze se ti zmeni fyzicke poradi sloupcu v GTT a te parove trvale tabulce.
Toho som si vedomý. Ale či sa v budúcnosti bude niečo meniť, tak to netuším.
Asi to bude lepšie vymenovať.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: Stanislav Hruška 20-06-2018, 14:58:26
Citace
Za to nemohla hvězdička, ale to, že po insertu každého záznamu došlo ke zkopírování všech už dosud vložených záznamů
Zjavne niektorí ľudia nečítajú celú tému ;)
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: KarelHorky 20-06-2018, 15:22:42
Nějak se to rozjelo  :)
Určitě je lepší, když si sloupce vyjmenuješ, zejména když děláš insert. Tiše tolerovat hvězdičku se dá jen u selectu, když víš, že nikdy nikde nerušíš žádné sloupce.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: pf1957 20-06-2018, 16:06:46
Nejen to. Da se to vubec napsat? Neco jako:

Kód: MySQL [Vybrat]
  1. INSERT INTO MyTable
  2. SELECT new.*;
Nevim, Nemam cas ani chut to zkouset, ale pri replikaci mez DB jsem pouzival tohle, takze mozna ne, to bych asi new.* pouzil rovnou, ale mozna to bylo kvuli tomu, ze jsem chtel nechat probehnout vsechny ostatni trigger, kterych tam bylo pozahnane, ale HOSIP. Nejjednoduzsi je to vyzkouset.
Kód: SQL [Vybrat]
  1.       INSERT INTO ACCOUNT$
  2.         SELECT gen_id(G_ACCOUNT$,1) AS ID$, A.* FROM ACCOUNT A
  3.           WHERE A.ID=NEW.ID
  4.             returning ID$ INTO :SNAPSHOTID;
  5.  
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: Stanislav Hruška 20-06-2018, 16:12:59

Citace
Nevim, Nemam cas ani chut to zkouset, ale pri replikaci mez DB jsem pouzival tohle, takze mozna ne, to bych asi new.* pouzil rovnou
Hore som písal, že to s * priamo nejde. Vloží všetky záznamy čo sú v tabuľke. Preto som aj spomínal, že to vidím na nový stĺpec, generátor a podmienku. Tak ako si to uviedol.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: vandrovnik 20-06-2018, 16:29:04

Citace
Nevim, Nemam cas ani chut to zkouset, ale pri replikaci mez DB jsem pouzival tohle, takze mozna ne, to bych asi new.* pouzil rovnou
Hore som písal, že to s * priamo nejde. Vloží všetky záznamy čo sú v tabuľke. Preto som aj spomínal, že to vidím na nový stĺpec, generátor a podmienku. Tak ako si to uviedol.

Pleteš dvě věci dohromady. Hvězdička znamená "všechny sloupce".
To, že se Ti zkopírovaly pokaždé všechny řádky, je proto, že v tom INSERT SELECT... jsi zapomněl použít WHERE, aby ten SELECT vrátil jen záznam, který byl aktuálně přidán.
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: pf1957 20-06-2018, 17:47:59
To, že se Ti zkopírovaly pokaždé všechny řádky, je proto, že v tom INSERT SELECT... jsi zapomněl použít WHERE, aby ten SELECT vrátil jen záznam, který byl aktuálně přidán.
Nooo, ja ziju v domneni, ze kontextova promenna new odpovida vkladanemu radku a pak by new.* mohlo (jak zpochybnil Delfin) vratit vsechna pole, ale nemelo by to vracet vsechny zaznamy - to jenom v pripade, ze by new chybelo. A pak pri pouziti by nemel potrebovat WHERE klauzuli. To jedine v pripade, jak jsem to delal ja, ze si sahnu pro zaznam new.ID, ale protoze uz je to hafo let, tak si nepamatuju, proc jsem to tak udelal, jestli ze to nejde nebo jestli jsem nechal nejdriv dobehnout vsechny triggery (muj byl vzdycky jako posledni)
Název: Re:Trigget - After Insert -> INSERT INTO
Přispěvatel: KarelHorky 21-06-2018, 08:40:37
Aby select vrátil jen vložený záznam, jde např. takto:

select * from tabulka where id = new.id;

Ale to bude zbytečně procházet celou tabulku, třeba při 5 milionech záznamů to nějakou chvíli potrvá.
Raději použít alias new, ten rovnou obsahuje kompletní nový záznam.