Avatar billede montago Praktikant
30. januar 2008 - 10:59 Der er 6 kommentarer og
1 løsning

Oprette en Trigger på Insert

Jeg er igang med at smide millioner af records ind i en tom database... databasen har jeg ikke selv oprettet, og indeholder nogle constraints og andre bindende funktioner imellem tabellerne som formegentlig giver mig problemer

Inden den første insert operation på een af tabellerne oplever jeg at nogle data på forhånd eksistere (sikker oprettet af en constraint? / funktion?)

mine inserts ser sådan her ud : "INSERT INTO [001table] VALUES ('data1','data2','data3');"

Jeg vil derfor oprette en Trigger ved INSERT på netop denne tabel.

hvis recorden allerede findes, skal den skippe netop den insert
og ellers indsætte dataene...
Avatar billede hrc Mester
30. januar 2008 - 11:30 #1
Hvis du må rette i databasen kan du slå constraints fra (powerpunks svar gentaget):

  alter table <tabel> nocheck constraints all

(det går sikkert også meget hurtigere) Derefter, alle data er indlæst, kan du slette de forkerte records

  delete from <tabel1> where tabel2_id not in (select id from <tabel2>)

(scriptet kan sikkert gøres smartere) og når endelig du er færdig:

  alter table <tabel> check constraint all
Avatar billede montago Praktikant
30. januar 2008 - 11:37 #2
hmm har allerede slået constraints fra... hjælper ik
Avatar billede montago Praktikant
30. januar 2008 - 11:39 #3
er nået frem til følgende:

ALTER TRIGGER Trigger1
ON dbo.[160Axle]
FOR INSERT
AS

DECLARE @test int
SELECT @test = count(*) from [160Axle] A, inserted B
WHERE A.modelkey = B.modelkey
    IF @test > 0
    BEGIN
       
        ROLLBACK TRANSACTION
    END
----------

desværre går programmet død - og siger at "the statement ended in the trigger, the batch has been aborted"
Avatar billede hrc Mester
30. januar 2008 - 12:22 #4
Tror du ikke det er meget langsomt at køre denne select på alle de records du indlæser?

Hvad med at oprette en temporær tabel, indlæse alle data og derefter køre en stored procedure på den. Den skal indeholde en cursor der gennemløber tabellen og indsætter de valide. Alternativt kan du indsætte i temp-tabellen og dernæst slette de invalide for at afslutte med en 1-1 kopiering til den "rigtige" tabel.
Avatar billede montago Praktikant
30. januar 2008 - 12:39 #5
der er ik så mange records i netop denne tabel (3500 stk) så det er ok den er lidt langsom... men jo... en SP ville nok være optimal.
Avatar billede montago Praktikant
30. januar 2008 - 14:38 #6
har fundet ud af, at det umiddelbart virker somom tabellen er defineret forkert... idet de records jeg prøver at lægge ind er fine nok... :-S
Avatar billede montago Praktikant
31. januar 2008 - 09:33 #7
har givet op...

slettede tabellen og oprettede den igen... nu virker det :p
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