Avatar billede superraider Nybegynder
02. februar 2008 - 13:29 Der 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.
Avatar billede trer Nybegynder
02. februar 2008 - 20:47 #1
Hej

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

Mvh
Troels
Avatar billede superraider Nybegynder
02. februar 2008 - 21:08 #2
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


Men Take for svaret
Avatar billede trer Nybegynder
03. februar 2008 - 00:36 #3
Hej Raider

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...

men tak for points :-)
Avatar billede superraider Nybegynder
03. februar 2008 - 04:23 #4
:) så må jeg hellere ændre den til din løsning.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester