我有一个INSTEAD OF INSERT
触发器的视图(在SQL Server 2005中)。当用户插入视图时,它们实际上是对许多表进行插入和更新。视图足够复杂,不能有索引,所以不幸的是不受约束。
正在使用可能有问题的代码从C#插入视图。此代码使用以下内容捕获主要和唯一密钥违规:
try
{
... // Insert into view
}
catch (SqlException ex)
{
if (ex.Number == 2627 || ex.Number == 2601) // Primary key exception, unique constraint violation
{
... // Report the duplicate entry to the user
}
else
{
throw;
}
}
所以我的问题是:我可以在触发器中使用RAISERROR
来创建数字为2627或2601的异常吗?
答案 0 :(得分:1)
没有。你必须等待THROW in the next release(也许)
您只能抛出已放入sys.messages(50000+)或带有50000的文本的错误。或者将其嵌入文本并更改您的c#。您不能抛出小于50000的错误
如果视图太复杂而无法使用DRI,则太复杂。此外,您还会遇到并发问题:重叠调用 会在您自己推出时突破您的“唯一性”。
答案 1 :(得分:0)
我不确定您是否真的RAISE
真正的主要密钥违规。虽然您可以使用自己的消息RAISE
自己的错误,然后catch
。这还可以让您区分真正的主键违规和您自己的自定义违规。
也许最简单的方法就是......
SQL代码(可能在TRIGGER
定义中)......
RAISERROR('Custom View Violation',16,1);
C#...
try
{
//execute SP / Insert etc...
}
catch (SqlException ex)
{
if (ex.Message.Split('\r')[0] == "Custom View Violation")
{
//deal with your exception
}
}