Проверка ссылочной целостности в хранимой процедуре

#tsql #stored-procedures #sql-server-2000 #referential-integrity

#tsql #хранимые процедуры #sql-server-2000 #ссылочная целостность

Вопрос:

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

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

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

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

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

Спасибо

Ответ №1:

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

  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
  

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

Ответ №2:

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

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

Взгляните на эту статью: http://www.sommarskog.se/error-handling-II.html

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