Autor Téma: Trigget - After Insert -> INSERT INTO  (Přečteno 3109 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Trigget - After Insert -> INSERT INTO
« kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #1 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #2 kdy: 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é.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #3 kdy: 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é.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 183
  • Karma: 8
    • Verze Delphi: 7, XE6
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #4 kdy: 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.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #5 kdy: 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?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2444
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #6 kdy: 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 :-)

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1652
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #7 kdy: 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.*;
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 616
  • Karma: 40
    • Verze Delphi: 10.3
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #8 kdy: 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.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #9 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 616
  • Karma: 40
    • Verze Delphi: 10.3
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #10 kdy: 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ů :-)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #11 kdy: 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ť.
« Poslední změna: 20-06-2018, 14:59:20 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #12 kdy: 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 ;)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 183
  • Karma: 8
    • Verze Delphi: 7, XE6
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #13 kdy: 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.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2444
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #14 kdy: 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.  
« Poslední změna: 20-06-2018, 16:10:37 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3938
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #15 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 616
  • Karma: 40
    • Verze Delphi: 10.3
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #16 kdy: 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.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2444
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #17 kdy: 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)

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 183
  • Karma: 8
    • Verze Delphi: 7, XE6
Re:Trigget - After Insert -> INSERT INTO
« Odpověď #18 kdy: 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.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: