只有在MSSQL中插入行时才强制执行约束检查?
答
您可以创建一个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都应该用木制的尺子严格地抨击你的指关节,试图用光标执行简单的插入操作。存储过程应该足够了。