2009-06-06 7 views
3

Перед удалением строки из таблицы есть ли простой способ проверить, будет ли она нарушать правило ссылочной целостности? Я хотел бы сделать это с C# победу формы приложения (.NET 3.5) с помощью SQL Server 2005.Проверка нарушения правил ссылочной целостности перед удалением

+0

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

ответ

1

Есть несколько возможных вариантов, которые приходят на ум:

  • Настройка каскадное удаление в базе данных, так что удаление всегда будет успешным.
  • Перед удалением проверьте связанные записи с помощью SELECT. Это требует, чтобы приложение знало ограничения.
  • Хорошая модель домена (бизнес-классы) должна позволить приложению быть в курсе связанных записей.
  • Для определения операций удаления каскадов можно использовать Mapper O/R, такой как NHibernate.
  • Используйте SMO (Microsoft.SqlServer.Smo) для проверки схемы базы данных для отношений, а затем проверьте наличие связанных записей. Я не знаю, возможно ли это.
1

Вы можете сделать удаление внутри транзакции:

try 
{ 
    begin transaction 
    delete row 
} 
catch SQLException 
{ 
    if SQL error indicates referential integrity violation 
    throw ReferentialIntegrityViolationException 
} 
finally 
{ 
    rollback transaction 
} 

(при условии, что вы никогда не хотите удаления иметь место в данный момент в вашем коде)

+0

Я бы подумал, что идея состоит в том, чтобы определить, нарушено ли правило без стоимости выполнения фактического выполнения удаления. Это решение имеет все проблемы с производительностью и ни одно из преимуществ;) –

+1

Почему? Проверка FK действительно SELECT * FROM ChildTable WHERE FKCOl = ParentKey. Для этого нужно дополнительное путешествие туда и обратно. Возможно, проще справиться с ошибкой – gbn

+0

... без использования хранимой процедуры и инкапсуляции SQL-запроса, так что это все однократное путешествие. – gbn

Смежные вопросы