Проверьте ссылочную целостность в хранимой процедуре - PullRequest
1 голос
/ 08 ноября 2011

У меня есть таблица customer и таблица order в базе данных sql server 2000.

Я не хочу, чтобы заказ был в таблице order с customerID, которыйне существует в таблице customer, поэтому я наложил ограничение внешнего ключа на customerID.

Все это прекрасно работает, но при написании хранимой процедуры, которая может нарушать ограничение, есть ли способпроверить, будет ли ограничение нарушено и, если это произойдет, пропустить / откатить запрос?

В ту минуту, когда все, что происходит, хранимая процедура возвращает ошибку, которая отображается на моей странице asp и выглядит довольнобезобразно + большинство пользователей этого не поймут.

Я бы хотел более элегантный способ обработки ошибки, если это возможно.

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 ноября 2011

Вы можете проверить данные перед попыткой операции, или вы можете попытаться выполнить операцию, а затем проверить ошибки после каждого оператора, затем ROLLBACK и т. Д.

Но вы можете полностью обработать их в хранимых процедурах и вернуть соответствующим образомдля вызывающего абонента в соответствии с вашим дизайном.

Посмотрите эту статью: http://www.sommarskog.se/error-handling-II.html

В SQL Server 2005 существует возможность использования TRY / CATCH

0 голосов
/ 08 ноября 2011

У вас есть два варианта:

  1. Добавить обработку ошибок, чтобы поймать уродливое, проверить его на наличие ошибок FK и показать его пользователю Это ИМХО лучшее решение.

  2. Добавьте код в хранимую процедуру, как показано ниже:

if exists (select null from customer where customerid=@customerId )  
begin  
  --The customer existed so insert order  
end  
else  
begin  
  --Do something to tell you code to display error message  
end

Со вторым параметром вам захочется следить за согласованностью транзакций. Например, что произойдет, если клиент будет удален после проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...