sql >> Databáze >  >> RDS >> Sqlserver

SQL Trigger Vkládání z více tabulek

Neodkazujete na vložené nebo odstraněné tabulky, které jsou dostupné pouze ve spouštěči, takže samozřejmě vracíte více záznamů, než potřebujete ve svém dotazu.

Při prvním psaní triggeru vytvořím dočasnou tabulku s názvem #inserted (a/nebo #deleted) a naplním ji několika záznamy. Měl by odpovídat designu stolu, na kterém bude spoušť. Je důležité, aby vaše dočasná tabulka měla několik vstupních záznamů, které by mohly splňovat různá kritéria ovlivňující váš dotaz (takže ve vašem případě chcete nějaké, kde by počet případů byl 0 a některé, kde by například nebyl) a to by bylo typické dat vložených do tabulky nebo aktualizovaného init. Spouštěče serveru SQL pracují se sadami dat, takže to také zajišťuje, že váš spouštěč může správně zpracovávat více záznamů uiinserts nebo aktualizací. Správně napsaný spouštěč by měl testovací případy, které musíte otestovat, abyste se ujistili, že vše proběhne správně, vaše #inserted tabulka by měla obsahovat záznamy, které splňují všechny tyto testovací případy.

Poté zapište dotaz do transakce (a vraťte jej zpět během testování) a připojte se k #inserted. Pokud děláte vložku s selectem, pište pouze vybranou část, dokud to nezískáte správně, a potom přidejte vložku. Pro testování zapište výběr z tabulky, do které vkládáte, abyste viděli data, která jste vložili, než se vrátíte zpět.

Jakmile vše funguje, změňte #inserted reference na insert, odstraňte veškerý testovací kód a samozřejmě rollback (možná celá transakce závisí na tom, co děláte.) a přidejte drop a vytvořte spouštěcí část kódu. Nyní můžete otestovat, že spouštěč funguje jako spouštěč, ale jste v dobré kondici, protože z dřívějšího testování víte, že pravděpodobně bude fungovat.




  1. Jak se vyhnout konfliktním podmínkám při použití metody find_or_create DBIx::Class::ResultSet?

  2. Je datum v některých obdobích

  3. Tabulka ALTER TABLE AUTO_INCREMENT =$x

  4. Musí se zrušení databáze provést ne v žádné transakci?