1

有没有办法仅在插入新行时在 MSSQL 中强制进行约束检查?即允许在删除/更新行时违反约束?

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

4

3 回答 3

7

您可以创建一个检查条件是否满足的 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
于 2008-09-02T05:42:55.557 回答
1

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

于 2008-09-02T05:37:42.387 回答
1

什么样的约束?我在猜测外键约束,因为您暗示删除一行可能会违反约束。如果是这种情况,看起来您本身并不需要约束,因为您不关心参照完整性。

在不了解您的具体情况的情况下,我会回应其他海报的意图,这似乎是“在您的数据访问层执行插入要求”。但是,我会对他们的实现提出质疑。触发器似乎有点矫枉过正,任何称职的 DBA 都应该用木尺严厉地敲打你的指关节,因为你试图使用光标来执行简单的插入操作。一个存储过程就足够了。

于 2008-09-02T06:30:44.850 回答