仅当在MSSQL中插入行时才强制执行约束检查吗?
时间:2020-03-05 18:46:16 来源:igfitidea点击:
仅在插入新行时,有没有办法在MSSQL中强制执行约束检查? IE。允许在删除/更新行时违反约束?
更新:我的意思是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
回答
什么样的约束?我正在猜测外键约束,因为我们暗示删除行可能会违反约束。在这种情况下,似乎我们实际上并不需要真正的约束,因为我们不必担心参照完整性。
在不了解具体情况的情况下,我会回想其他张贴者的意图,这似乎是"在数据访问层中强制执行插入要求"。但是,我会质疑它们的实现。扳机似乎过大了,任何有能力的DBA都应使用木尺严厉地指责指关节,以尝试使用游标执行简单的插入操作。存储过程就足够了。