23. februar 2012 - 20:30Der 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;
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).
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).
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.