Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
yyy
Member

Откуда:
Сообщений: 383
добрый день,

подскажите pls как SQL Server при удалении записи проверяет есть ли ссылки на эту запись в других таблицах?

спасибо!
25 авг 04, 12:23    [906391]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Не скромный вопрос можно - а зачем вы это хотите знать?
25 авг 04, 12:50    [906537]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
yyy
Member

Откуда:
Сообщений: 383
есть таблица OBJECT(ID int, NAME varchar(100)), на нее есть foreing keys в других таблицах. Проблема - после удаления последней записи ссылающейся на запись из OBJECT, эту запись из OBJECT нужно удалить. В настоящий момент это делается через счетчик в OBJECT и триггеры ,которые при insert/delete/update изменяют состояние счетчика и если он =0, то удаляют запись из OBJECT. Хотелось бы сделать более оптимально.
25 авг 04, 12:59    [906574]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
С помощью схп sp_fkeys получите перечень таблиц (и полей), ссылающихся на вашу таблицу. И для каждой записи набора проверьте существование записей. Если таких нет, то удалить.

Ну, это если надо проверять. А если не надо, то просто пытаться удалить. Правда в этом случаи на клиенте придеться ошибку нарушения внешнего ключа давить.
25 авг 04, 13:15    [906651]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
yyy
Member

Откуда:
Сообщений: 383
1й способ не подходит т.к. таблиц ссылающихся на Object около 100, они все большие, если каждый раз проверять - будет очень медленно.

2й способ - не подходит, т.к. придется сначала делать select (для нахождения всех записей, которые должны быть удалены), потом delete и потом еще для каждои записи delete (пытаться ее удалить). Будет еще медленнее чем сейчас.

есть ли другие варианты?
25 авг 04, 13:22    [906697]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
Alex Kuznetsov
Member

Откуда: Ростов-на-Дону
Сообщений: 1789
yyy
1й способ не подходит т.к. таблиц ссылающихся на Object около 100, они все большие, если каждый раз проверять - будет очень медленно.

2й способ - не подходит, т.к. придется сначала делать select (для нахождения всех записей, которые должны быть удалены), потом delete и потом еще для каждои записи delete (пытаться ее удалить). Будет еще медленнее чем сейчас.

есть ли другие варианты?


Ну тогда только отключение FK и перенос поддержки логики целостности
данных на клиента.
25 авг 04, 13:24    [906710]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
yyy
Member

Откуда:
Сообщений: 383
это еще хуже будет :)
вариант который в oracle предполагается реализовать - в триггере на delete/update пытаться удалить запись с обработкой ошибки. Но в sql server такой возможности нет.
25 авг 04, 13:30    [906746]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
А мне первоначальная идея со счетчиком нравится. Она достаточно проста в реализации и меньше будет нагружать сервер и лочить данные, чем вон те здоровенные селекты.
25 авг 04, 13:35    [906775]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
Александр Спелицин
Member

Откуда: Из ближайшего подмосковья.
Сообщений: 2506
yyy
это еще хуже будет :)
вариант который в oracle предполагается реализовать - в триггере на delete/update пытаться удалить запись с обработкой ошибки. Но в sql server такой возможности нет.


Ну почему же нет?
Declare @Err int
Select @Err = 0
Begin transaction

Delete From <Your Table>
Where...

Select @Err = @@error

Rollback Transaction
Затем анализируем @Err
25 авг 04, 13:38    [906796]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
2й способ - не подходит, т.к. придется сначала делать select (для нахождения всех записей, которые должны быть удалены), потом delete и потом еще для каждои записи delete (пытаться ее удалить). Будет еще медленнее чем сейчас.



Что-то я не понял, чем второй вариант не проходит?! Медленнее чем что? Чем проверять счетчик для каждорй записи и удалять? Чего уж проше попытаться удалить и фсё, если связанных нет, то запись удалиться.
25 авг 04, 13:46    [906846]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
yyy
Member

Откуда:
Сообщений: 383
да, если я делаю например delete с каким-то условием и по нему должно удалится 1000 записей. по этому варианту придеться сначала делать select, потом delete, и потом еще delete для каждой выбранной записи , так?
25 авг 04, 13:55    [906891]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Так, давайте определимся - 1 000 это записи в подчиненной таблице или нет?
25 авг 04, 14:06    [906939]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
yyy
Member

Откуда:
Сообщений: 383
да
25 авг 04, 14:09    [906956]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Мда. мой вариант будет не быстрее. :(
25 авг 04, 14:17    [907007]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
Fok
Guest
В таблице связанной с OBJECT создать тригер Afta Delet и внем удалять запись из OBJECT. Если выдаст ошибку (есть ссалка на запись из OBJECT), то откат транзакции.
25 авг 04, 14:44    [907187]     Ответить | Цитировать Сообщить модератору
 Re: как SQL Server при удалении записи проверяет есть ли ссылки на эту запись?  [new]
Fok
Guest
В таблице связанной с OBJECT создать тригер Afta Delet и внем удалять запись из OBJECT. Если выдаст ошибку (есть ссалка на запись из OBJECT), то откат транзакции.
25 авг 04, 14:49    [907234]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить