Avatar billede prhan Juniormester
23. februar 2012 - 20:30 Der er 3 kommentarer og
1 løsning

Triggers after insert update

Følgende trigger fungere fint, men prorgammet giver kun den første raiserror tilbage uanset om fejlne ligger i det andet kriterium. Foreslag til forbedring modtages gerne:

CREATE TRIGGER tg_Site
ON dbo.site
AFTER INSERT, UPDATE
AS

BEGIN
SET NOCOUNT ON;

    IF EXISTS
    (
    SELECT *
      FROM dbo.site, dbo.dkj_site_spec 
      WHERE dbo.dkj_site_spec.site_seq_no = dbo.site.site_seq_no AND
            dbo.dkj_site_spec.report_to_dkj = '1' AND 
          dbo.site.site_name IS NULL
    )

    BEGIN
      RAISERROR ('LOKALITETEN SKAL HAVE ET NAVN',16,1)
    ROLLBACK TRANSACTION
    END;
   
    IF EXISTS
    (
    SELECT * 
    FROM dbo.site, dbo.dkj_site_spec 
    WHERE dbo.dkj_site_spec.site_seq_no = dbo.site.site_seq_no AND 
        dbo.site.created > '01-01-2010' AND 
        dbo.site.init IS NULL
    )

    BEGIN
      RAISERROR ('LOKALITETEN SKAL HAVE EN SAGSBEHANDLER',16,1)
    ROLLBACK TRANSACTION
    END;

END;
GO
Avatar billede gnoname Praktikant
24. februar 2012 - 00:02 #1
Og du er sikker på, at der ikke findes en forekomst i tabellerne, der allerede opfylder det første kriterie?
Jeg mener; din trigger tester jo også på alt det data, der i forvejen ligger i tabellerne, og ikke kun på det du prøver at sætte ind (hvilket jeg nok selv ville have foretrukket).
Avatar billede prhan Juniormester
24. februar 2012 - 08:41 #2
Ok, du mener, at mit select statement bør isoleres til den enkelte variabel?
Avatar billede gnoname Praktikant
24. februar 2012 - 11:45 #3
Ja, jeg ville kun checke det data man forsøger at indsætte/update.
Jeg ville nok benytte en BEFORE INSERT trigger i stil med:

CREATE TRIGGER tg_Site
  BEFORE UPDATE ON dbo.site
    FOR EACH ROW
      BEGIN
        IF NEW.site_name IS NULL THEN
          BEGIN
            RAISERROR ('LOKALITETEN SKAL HAVE ET NAVN',16,1)
            ROLLBACK TRANSACTION
          END;
        ELSEIF NEW.init IS NULL THEN
          BEGIN
            RAISERROR ('LOKALITETEN SKAL HAVE EN SAGSBEHANDLER',16,1)
            ROLLBACK TRANSACTION
          END;
        END IF;
      END;

og en tilsvarende BEFORE UPDATE trigger - for jeg mener ikke du kan kombinere en UPDATE og INSERT trigger i MySql (men der tager jeg muligvis fejl).
Avatar billede prhan Juniormester
18. december 2012 - 12:17 #4
Lukket
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