2008-09-02 9 views

Répondre

7

Vous pouvez créer un INSERT TRIGGER qui vérifie que les conditions sont remplies. De cette façon, toutes les mises à jour iront directement à travers.

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

Je pense que votre meilleur pari est de supprimer la contrainte explicite et d'ajouter un cursor pour les insertions, de sorte que vous pouvez effectuer votre vérification et générer une erreur si la contrainte est violée.

1

Quelles sortes de contraintes? Je suppose que les contraintes de clé étrangère, car vous impliquez que la suppression d'une ligne peut violer la contrainte. Si tel est le cas, il semble que vous n'ayez pas vraiment besoin d'une contrainte en soi, puisque vous n'êtes pas concerné par l'intégrité référentielle. Sans en savoir plus sur votre situation spécifique, je ferais écho à l'intention des autres affiches, ce qui semble être «appliquer les exigences d'insertion dans votre couche d'accès aux données». Cependant, je ergoterais avec leurs implémentations. Un déclencheur semble être exagéré et n'importe quel DBA compétent devrait vous rapper sévèrement sur les jointures avec une règle en bois pour essayer d'utiliser un curseur pour effectuer une insertion simple. Une procédure stockée devrait suffire.