2008-09-02 6 views

Antwort

7

Sie könnten einen INSERT TRIGGER erstellen, der prüft, ob die Bedingungen erfüllt sind. Auf diese Weise werden alle Updates direkt übertragen.

CREATE TRIGGER employee_insupd 
ON employee 
FOR INSERT 
AS 
/* Get the range of level for this job type from the jobs table. */ 
DECLARE @min_lvl tinyint, 
    @max_lvl tinyint, 
    @emp_lvl tinyint, 
    @job_id smallint 
SELECT @min_lvl = min_lvl, 
    @max_lvl = max_lvl, 
    @emp_lvl = i.job_lvl, 
    @job_id = i.job_id 
FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id 
    JOIN jobs j ON j.job_id = i.job_id 
IF (@job_id = 1) and (@emp_lvl <> 10) 
BEGIN 
    RAISERROR ('Job id 1 expects the default level of 10.', 16, 1) 
    ROLLBACK TRANSACTION 
END 
ELSE 
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl) 
BEGIN 
    RAISERROR ('The level for job_id:%d should be between %d and %d.', 
     16, 1, @job_id, @min_lvl, @max_lvl) 
    ROLLBACK TRANSACTION 
END 
1

Ich denke, Ihre beste Wette ist, die explizite Einschränkung zu entfernen und eine cursor für Einfügungen hinzuzufügen, so dass Sie dort Ihre Überprüfung durchführen und einen Fehler auslösen können, wenn die Einschränkung verletzt wird.

1

Welche Art von Einschränkungen? Ich schätze Fremdschlüsseleinschränkungen, da Sie implizieren, dass das Löschen einer Zeile die Einschränkung verletzen könnte. Wenn das der Fall ist, scheint es, als ob Sie per se keine Einschränkung benötigen, da Sie sich nicht mit referenzieller Integrität beschäftigen.

Ohne mehr über Ihre spezifische Situation zu wissen, würde ich die Absicht der anderen Poster wiederholen, die "die Einfügeanforderungen in Ihrer Datenzugriffsebene zu erzwingen" scheint. Allerdings würde ich mit ihren Implementierungen streiten. Ein Trigger scheint übertrieben zu sein und jeder kompetente DBA sollte Sie mit einem hölzernen Lineal strikt auf die Fingerknöchel schlagen, um zu versuchen, einen Cursor zu verwenden, um einen einfachen Einsatz durchzuführen. Eine gespeicherte Prozedur sollte ausreichen.