我正在查看一些代码(我没有写它!)来测试我们的代码在尝试删除存在依赖项的表行时捕获了两个错误条件。
该代码最初在消息中查找特定文本,而不是使用错误编号。
为了提供多语言支持,最好根据错误号而不是错误消息来捕获异常。
在测试中,代码正在寻找两组文本,我似乎无法确定区别是什么,所以只是检查错误号547是不舒服的。
假设两条错误消息的错误号都是547,这样可以安全吗? 干杯 科林
答案 0 :(得分:8)
547是用于任何约束违规的错误代码,而不仅仅是外键,例如:
create table T (
ID int not null,
constraint CK_Not1 CHECK (ID != 1)
)
go
insert into T (ID) values (2)
go
update T set ID = 1
(1 row(s) affected)
Msg 547, Level 16, State 0, Line 1
The UPDATE statement conflicted with the CHECK constraint "CK_Not1". The conflict occurred in database "Flange", table "dbo.T", column 'ID'.
The statement has been terminated.
话虽如此,除了外键之外,我无法想到(帽子提示@onedaywhen )DELETE
声明可能违反的任何其他类型的约束。
如果您查看sys.messages
,您会看到547必须违反约束条件:
select text from sys.messages where message_id=547 and language_id=1033
%ls语句与%ls约束“%。* ls”冲突。冲突发生在数据库“%。* ls”,表“%。* ls”%ls%。* ls%ls。
答案 1 :(得分:2)
Damien_The_Unbelieve: 我想不出任何其他类型的约束, 除了外键之外,DELETE语句可能会违反。
这是另一个:
CREATE TABLE T1 (ID INTEGER NOT NULL UNIQUE);
CREATE TABLE T2
(
ID INTEGER DEFAULT 0 NOT NULL
REFERENCES T1 (ID) ON DELETE SET DEFAULT
CONSTRAINT cannot_be_zero CHECK (ID <> 0)
);
INSERT INTO T1 (ID) VALUES (1);
INSERT INTO T2 (ID) VALUES (1);
DELETE FROM T1;
生成错误:
消息547,级别16,状态0,行5 DELETE语句发生冲突 使用CHECK约束“cannot_be_zero”。