Trigger pro zrcadlení záznamů při UPDATE column – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Trigger pro zrcadlení záznamů při UPDATE column – MySQL – Fórum – Programujte.comTrigger pro zrcadlení záznamů při UPDATE column – MySQL – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
fix0
Stálý člen
14. 9. 2019   #1
-
0
-

Ahoj,

potřebuji něco jako archiv záznamů u kterých se u záznamu ve sloupečku dokončeno nastaví na hodnotu "1".

Mám takové tušení, že nejjednodušší cestou by mohl být trigger (spouštěč), ale nikdy jsem to nedělal, snažil jsem se googlit, ale stejně jsem tomu moc nerozuměl.

Můžete mi prosím někdo sdělit, jestli to bude fungovat?

Šlo by trigger nějak formulovat tak, aby když se vykoná tento dotaz, aby se automaticky celý záznam zkopíroval do tabulky "archiv"?

UPDATE table  SET `dokonceno` = "1"  WHERE id = '.$_GET['id'].';

Pseudokod:

Pokud(se nastaví u záznamu hodnota sloupečku "dokonceno" na hodnotu "1" v určité tabulce){

    Zkopíruj ten záznam v němž došlo k úprave sloupečku "dokonceno" na hodnotu "1" do tabulky "archiv";

}

Když se mi podaří nejak sestavit ten pseudokod, bude to takto fungovat? Kde vezmu proměnné pro insert?

Připojen obrázek.

Děkuji všem za rady a tipy.

Nahlásit jako SPAM
IP: 31.30.173.–
Kit+15
Guru
14. 9. 2019   #2
-
0
-

#1 fix
Trigger je aktivován ve chvíli, kdy změníš kterýkoli sloupeček v záznamu. Stačí do toho triggeru přidat jednu podmínku. Záznam před a po změně najdeš v "tabulkách" OLD a NEW.

Jsou vždy 3 triggery: pro INSERT, DELETE a UPDATE.

Nahlásit jako SPAM
IP: 46.135.86.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
fix0
Stálý člen
14. 9. 2019   #3
-
0
-

#2 Kit
Trigger bude aktivován při změně libovolného sloupečku, ale tak jak to mám v těle toho co má vykonat to jde dodatečně doselektovat způsobem aby při upravě pro mě nezajímavého sloupečku nedělal nic, ale při zpravě sloupečku "dokonceno" na hodnotu "1" něco udělal. Typy triggerů chápu také, mě tedy zajímá trigger UPDATE.

Což mi ale ještě není jasné je kde se vezmou ty tabulky OLD & NEW, asi se nějak vytvoří sami, jak fungují asi pochopím až budu mít trigger nějak funkční. I když asi tuším, že ta tabulka NEW bude pravděpodobně mnou zmiňovaná tabulka "archiv" akorát se bude jmenovat "new", a ta tabulka old asi bude prázdná, nebo nevím. To asi v této fázi nemusíme řešit.

Takže tělo triggeru by mělo vypadat podle mého pseudokodu nějak takto:


IF UPDATE (dokonceno = "1")

     INSERT INTO archiv (id, nazev, datum, dokonceno)
     VALUES (NULL, this.nazev, this.datum, this.dokonceno);

END;

Je to dobrá myšlenka? Jdu dobrým směrem? Můžete mě prosím někdo případně opravit, pokdu to chápu špatně? Děkuji moc.

EDIT: Že by nějak takhle?


UPDATE TRIGGER archivovat
ON table
FOR UPDATE
AS
	IF(SELECT * FROM table WHERE dokonceno = "1";)
		BEGIN
    			INSERT INTO archiv (id, nazev, datum, dokonceno) VALUES (NULL, this.nazev, this.datum, this.dokonceno);
			PRINT ' Updatovaný záznam byl aktivován, protože byl změněn sloupeček "dokončeno" na hodnotu "1"'
		END
	ELSE
		BEGIN
			PRINT ' Updatovaný záznam byl aktivován, protože nebyl změněn sloupeček "dokončeno" na hodnotu "1"'
		END
Nahlásit jako SPAM
IP: 31.30.173.–
Kit+15
Guru
14. 9. 2019   #4
-
0
-

#3 fix
Místo this se obvykle dává OLD pro záznam před UPDATE nebo NEW po něm.

Syntaxi si uprav podle dokumentace.

Nahlásit jako SPAM
IP: 46.135.86.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
fix0
Stálý člen
15. 9. 2019   #5
-
0
-

#4 Kit
Už chápu new & old proměnné.

Něco jsem zkusil podle jednoho návodu, ale píše mi to chybovku.

Návod:

Připojen obrázek.

Je tam někde v tom mém zápisu vidět ona syntaktická chyba? Resp. někde jsem přečetl, že existují jen tabulky inserted&deleted, ale updated nikoliv. V tom případě mi není vůbec jasné, jak to mám řešit. :-D

IF(SELECT dokonceno FROM updated)= 1
BEGIN
	print ' Ano, tento záznam archivovat'
END
ELSE
BEGIN
	print ' Ne, tento záznam nearchivovat'
END

Připojen obrázek.

Připojen obrázek.

Připojen obrázek.

Připojen obrázek.

Děkuji za pomoc.

Edit: Našel jsem příklad, který by měl řešit, můj problém, ale nechápu jak to funguje, můžete mi to prosím vysvětlit a nasměrovat mě jak bych to měl řešit já?

Příklad:

CREATE TRIGGER TR_UpdateNew
   ON  Users
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @user_id INT
    SELECT
      @user_id = inserted.UserID
    FROM
      inserted
    INNER JOIN
      deleted
        ON inserted.PrimaryKey = deleted.PrimaryKey
        -- It's an update if the record is in BOTH inserted AND deleted

    EXEC UpdateProfile @user_id;

END
GO
Nahlásit jako SPAM
IP: 31.30.173.–
Kit+15
Guru
15. 9. 2019   #6
-
0
-

#5 fix
tady se používá právě to NEW.updated

Nahlásit jako SPAM
IP: 46.135.86.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
fix0
Stálý člen
15. 9. 2019   #7
-
0
-

#6 Kit
 Jo ahá, to sem myslel, že mám uplatnit až pro práci s hodnotami, které hodlám předávat dále. Težko chápat z jakého pohledu je to pro koho new. Protože se bavíme o update stávající tabulky, new sem očekával že by mělo být až pro tu novou tabulku, kterou spravuje ten trigger.

Stejně to ale nefunguje, chybová hláška mi přijde stejná jako ta předtím. V tom návodu to měl také nez "new", ale mám pocit, že on asi používá MS SQL, ale nejsem si jistý, nepoznám to. :-)

IF(SELECT dokonceno FROM new.updated)= 1
BEGIN
	print ' Ano, tento zaznam archivovat'
END
ELSE
BEGIN
	print ' Ne, tento zaznam nearchivovat'
END
IF(SELECT new.dokonceno FROM new.updated)= 1
BEGIN
	print ' Ano, tento zaznam archivovat'
END
ELSE
BEGIN
	print ' Ne, tento zaznam nearchivovat'
END

Našel  jsem ještě příklad, kde to řešili jen nějak takto, ale také mi to nefakčí:

IF NEW.dokonceno = 1
BEGIN
	print ' Ano, tento zaznam archivovat'
END
ELSE
BEGIN
	print ' Ne, tento zaznam nearchivovat'
END

Asi by mi to stačilo jen takto:

Připojen obrázek.


Ale ani takto to nechce vzít:

Připojen obrázek.

Nahlásit jako SPAM
IP: 31.30.173.–
Kit+15
Guru
15. 9. 2019   #8
-
0
-

#7 fix
Nepsal jsem new, ale NEW.

Co má dělat ten print?

Nahlásit jako SPAM
IP: 46.135.86.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Řešení
fix0
Stálý člen
15. 9. 2019   #9
-
0
-
Vyřešeno Nejlepší odpověď

Takhle jednoduché to bylo a tím zabil půl dne :-D

IF new.dokonceno = 1 THEN 
	INSERT INTO archiv (nazev,dokonceno) VALUES (new.nazev,new.dokonceno);
END IF

 

Díky za pomoc (y).

Nahlásit jako SPAM
IP: 31.30.173.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý