Поднимите конкретную ошибку в t-SQL с помощью RAISERROR - PullRequest
1 голос
/ 28 октября 2011

У меня есть представление с триггером 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?

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Нет.Вам придется подождать THROW в следующем выпуске (возможно)

Вы можете выбросить только те ошибки, которые были помещены в sys.messages (50000+) или с текстом, который дает50000. Или вставьте его в текст и измените ваш c #.Вы не можете выдавать ошибки меньше, чем 50000

Если представление настолько сложное, что вы не можете использовать DRI, то оно слишком сложное.Кроме того, у вас будут проблемы с параллелизмом: перекрывающиеся вызовы будут нарушать вашу «уникальность» в какой-то момент, когда вы бросаете свои собственные.

0 голосов
/ 28 октября 2011

Я не уверен, что вы действительно можете 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
    }
}
...