1

我有一个有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 的异常吗?

4

2 回答 2

1

不,您必须等待下一个版本中的 THROW(也许)

您只能抛出已放入 sys.messages (50000+) 的错误,或者给出 50000 的文本。或者将其嵌入到文本中并更改您的 c#。你不能抛出小于 50000 的错误

如果视图太复杂以至于不能使用 DRI,那么它就复杂了。此外,您还会遇到并发问题:当您自己滚动时,重叠调用会在某些时候破坏您的“唯一性”。

于 2011-10-28T09:45:30.230 回答
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
    }
}
于 2011-10-28T09:48:21.800 回答