02. februar 2008 - 13:29Der er
3 kommentarer og 1 løsning
Trigger, insert after insert.
Hej, jeg har lavet en trigger efter sådan som tingene er definered i min lærebog :D Men det virker ikke med MS SQL 2005 og kan simpelt hen ikke få det omskrevet til at virke.
CREATE TRIGGER MemberCreated AFTER INSERT OF UserID ON [borked].Users REFERENCING NEW AS N FOR EACH ROW WHEN (N.IsApproved == 0) INSERT INTO [borked].UsersPending (userid) VALUES(N.UserID)
Den skal, når der insetes et row i [borked].Users, så checke om det insatte row's kolonne 'IsApproved' er = 0. hvis den er lig 0, så skal den også lave et row i en anden tabel, [borked].UsersPending som følgende: INSERT INTO [borked].UsersPending (userid) VALUES(N.UserID) Den skal bare insert Users.UserID fra det indsatte row i Users i UsersPending, så er der der default værdier på de andre kolonner.
Problemet er nok at din lærebog vist er rettet mod Oracle og ikke SQL Server. Check "Books Online" som du får installeret sammen med SQL Server client tools (Management Studio) eller finder online ved Microsoft, så vil du kunne se den korrekte syntaks.
Kort opsummeret: Til forskel fra Oracle tillader SQL Server kun after statement triggers (ikke row triggers) og indsatte data findes i de virtuelle tabeller "inserted" og "deleted".
I øvrigt bør man aldrig bruge rowbased triggers hvis en statement trigger an løse opgaven. Row based triggers er at sammenligne med cursors og dermed ikke så hurtige som en setbaseret operation.
Et hurtigt forslag til sql syntaksen:
create trigger membercreated after insert as insert into borked.userpending (userid) select userid from inserted where isaproved=0
Jeg fandt faktisk en løsning, og glemte helt at svare here.
USE [swebdb] GO /****** Object: Trigger [borked].[MemberCreated] Script Date: 02/02/2008 21:07:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [borked].[MemberCreated] ON [borked].[Users] AFTER INSERT AS BEGIN SET NOCOUNT ON; BEGIN DECLARE @id int SELECT @id = UserID FROM inserted WHERE IsApproved = 0; INSERT INTO [borked].UsersPending ([userid]) values (@id) END END
ja, din løsning vil virke - men kun så længe der indsættes een række ad gangen.
Hvis indsættelsen i Users tabellen består af flere rækker bliver din trigger kun kaldt een gang - og så overføres kun et af de opdaterede userids, ikke samtlige...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.