只有在MSSQL中插入行时才强制执行约束检查?

问题描述:

只有插入新行时才有强制执行MSSQL约束检查的方法吗?即在删除/更新行时允许违反约束条件?只有在MSSQL中插入行时才强制执行约束检查?

更新:我的意思是FK约束。

您可以创建一个INSERT TRIGGER来检查条件是否满足。这样所有更新都会直接进行。

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 

我认为你最好的选择是删除显式约束并为插入添加一个cursor,这样你就可以在那里执行你的检查并在违反约束时产生一个错误。

什么样的约束?我在猜测外键约束,因为你暗示删除一行可能会违反约束条件。如果是这样的话,似乎你本身并不需要约束,因为你不关心参照完整性。

不知道更多关于您的具体情况,我会回应其他海报的意图,这似乎是“强制执行数据访问层中的插入要求”。但是,我会狡猾地实施它们。一个触发器看起来像是矫枉过正,任何有能力的DBA都应该用木制的尺子严格地抨击你的指关节,试图用光标执行简单的插入操作。存储过程应该足够了。