Avatar billede curriculum Nybegynder
14. september 2004 - 16:33 Der er 10 kommentarer

Fejl med trigger i DTS routine

Min ms sql trigger vil ikke flytte data fra tabel1 til tabel2, da insert i tabel1 bliver kørt via DTS. Hvorfor ???
Hvis jeg inserter i tabel1 enkeltvis, så fungerer triggeren.

Er det ikke noget med en wait funktion i DTS designeren !!
Avatar billede gudjon Nybegynder
15. september 2004 - 08:50 #1
Kan du ikke vise os trigger koden i første omgang
Avatar billede curriculum Nybegynder
15. september 2004 - 11:23 #2
CREATE TRIGGER trInsertCustomer ON [dbo].[customer_import]
FOR INSERT
AS
DECLARE   
    @Nummer nvarchar(36),
    @Navn nvarchar(255),
    @Adresse nvarchar(255),
    @Adresse2 nvarchar(255),
    @Postnr varchar(255),
    @City nvarchar(255),
    @Telefon varchar(255),
    @Telefax varchar(255),
    @DebitorGruppe varchar(255),
    @Spærret nvarchar(255)

SELECT   
    @Nummer = Nummer,
    @Navn = Navn,
    @Adresse = Adresse,
    @Adresse2 = Adresse2,
    @Postnr = Postnr,
    @City = City,
    @Telefon = Telefon,
    @Telefax = Telefax,
    @DebitorGruppe = DebitorGruppe,
    @Spærret = Spærret
FROM inserted
IF NOT EXISTS(SELECT CustomerID FROM tCustomer_tmp WHERE CustomerID = @Nummer)
BEGIN
    INSERT INTO tCustomer_tmp (CustomerID,sName,sAddress,sAddress2,sPostalNumber,sCity,sTel,sFax,sDebitorGroup,sBlocked)
    VALUES    (@Nummer,@Navn,@Adresse,@Adresse2,@Postnr,@City,@Telefon,@Telefax,@DebitorGruppe,@Spærret)
END
Avatar billede gudjon Nybegynder
15. september 2004 - 11:55 #3
Kan problemet være at der oprettes flere rækker på een gang i tabellen?
Såfremt der oprettes flere rækker på een gang i tabellen, vil din trigger kun reagere på den sidste række i INSERTED tabellen. Om du skal håndtere alle række i INSERTED, skal du løbe igennem INSERTED tabellen og håndtere hver enkelt række.
F.eks. med:

SELECT @Nummer = 0
WHILE 1 = 1
BEGIN
  SELECT @Nummer = MIN(Nummer)
  FROM INSERTED
  WHERE Nummer > @Nummer

  IF @Nummer IS NULL
    BREAK

  SELECT {felter}
  FROM INSERTED
  WHERE Nummer = @Nummer
END
Avatar billede curriculum Nybegynder
15. september 2004 - 16:10 #4
rækkerne bliver inserted med en loader, det er muligt at flere rækker bliver inserted på een gang. Jeg prøver lige din kode...
Avatar billede curriculum Nybegynder
16. september 2004 - 14:12 #5
Triggeren blev ikke kørt med din kode. Fungerer ligesom før... :(
Avatar billede gudjon Nybegynder
16. september 2004 - 14:52 #6
Det kunne være "Wait for trigger" (se online books med søging på "Wait for Trigger").
Avatar billede curriculum Nybegynder
16. september 2004 - 15:35 #7
Ja jeg ved "Wait for trigger" funktionen er der, men jeg får den ikke at fungere.
Måske for "Message Queue" dims ikke er installeret på serveren, eller noget andet...
Avatar billede gudjon Nybegynder
16. september 2004 - 16:23 #8
Jeg kan ikke gennemskue herfra hvad der er galt.
Der findes måske en work-around med en stored procedure der udfører det arbejde som triggeren skulle have lavet?
Avatar billede curriculum Nybegynder
17. september 2004 - 14:02 #9
Jeg har valgt at gøre to procedures, istedet for triggeren.
her er koden til insert proceduren..

CREATE Procedure vInsertCustomer
AS
DECLARE
    @Nummer nvarchar(36),
    @Navn nvarchar(255),
    @Adresse nvarchar(255),
    @Adresse2 nvarchar(255),
    @Postnr varchar(255),
    @City nvarchar(255),
    @Telefon varchar(255),
    @Telefax varchar(255),
    @DebitorGruppe varchar(255),
    @Spærret nvarchar(255)

SELECT @Nummer = 0
WHILE 1 = 1
BEGIN
    SELECT @Nummer = MIN(Nummer)
    FROM INSERTED
    WHERE Nummer > @Nummer

    IF @Nummer IS NULL
    BREAK

    SELECT
    @Nummer = Nummer,
    @Navn = Navn,
    @Adresse = Adresse,
    @Adresse2 = Adresse2,
    @Postnr = Postnr,
    @City = City,
    @Telefon = Telefon,
    @Telefax = Telefax,
    @DebitorGruppe = DebitorGruppe,
    @Spærret = Spærret
    FROM INSERTED
    WHERE Nummer = @Nummer

    IF NOT EXISTS(SELECT CustomerID FROM tCustomer_tmp WHERE CustomerID = @Nummer)
    BEGIN
        INSERT INTO tCustomer_tmp (CustomerID,sName,sAddress,sAddress2,sPostalNumber,sCity,sTel,sFax,sDebitorGroup,sBlocked)
        VALUES    (@Nummer,@Navn,@Adresse,@Adresse2,@Postnr,@City,@Telefon,@Telefax,@DebitorGruppe,@Spærret)
    END
END

GO
Avatar billede gudjon Nybegynder
17. september 2004 - 14:16 #10
Det her går ikke fordi at du har ikke adgang til INSERTED udenfor en trigger.

Kan du ikke fortælle mig hvad det er du har tænkt dig at lave med DTS og så kan der måske være en anden løsning på det her. F.eks. om du importerer data, så kan data importeres i en tredje tabel først, for derefter at blive overført til tabel1 med en sp. Dvs. process 1 er import til tabel0, process 2 er en sp der flytter data fra tabel0 til tabel1/tabel2.
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