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

Откуда: Москва
Сообщений: 6
Существует таблица, с полем ID которой связаны еще несколько таблиц (RelationShip).
если перед удалением я сам начинаю проверять наличие записей в других таблицах, то это занимает значительный временной интервал :(
Но это еще пол беды....
Основной вопрос - при Select из таблицы ... надо выдать на клиент еще и поле-флаг,о наличии ссылок на данную запись таблицы :((( Какие же это будут тормоза...
Однако при попытке удаления ключи FK_трам-пам-пам...
срабатывают почти мгновенно :N
Объясните мне, дураку, как это работает. Знаю что ключи хранится в таблице
sysobjects, но как определяется его значение для конкретной записи?

Подскажите кто-нибудь... Заранее благодарен.
20 апр 03, 10:51    [179568]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
vap
Member

Откуда:
Сообщений: 487
Перед проверкой не обязательно искать все ссылки.
Выполните команду DELETE а потом проверьте @@ERROR
зачем вычисляйть поле-флаг в команде SELECT, вычисляйте его при необходимости.
20 апр 03, 11:14    [179572]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
Kavi
Member

Откуда: Москва
Сообщений: 6
К сожалению как раз необходимость состоит в анализе всех ссылок, так как для клиента очень важна информация о том, что на данную запись отсутствуют (пропали/закончились) все ссылки. К сожалению из-за раздробленности данных, ссылающихся на данную тбл. невозможно добавить и использовать далее поле ссылок на текущую запись. Единственный вариант - это определение значения ключа FK для данной записи.
20 апр 03, 12:55    [179580]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
dao
Member

Откуда: Москва
Сообщений: 771
Можно зайти с боку - вести дот.поле о присутствии RelationShip - формировать его тригерами - Это даст информацию о том что - у записи есть связи но не даст инфы какие именно - но я думаю вам это и не надо :))
20 апр 03, 13:41    [179585]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
Mik Prokoshin
Member

Откуда: Барнаул
Сообщений: 1240
А индекс по выбираемому FK в таблице, из которой exists делается есть ? Обычно при наличии индекса такой запрос особых тормозов вызывать не должен...
20 апр 03, 14:05    [179589]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
Kavi
Member

Откуда: Москва
Сообщений: 6
по поводу триггера поподробнее, если можно...
Я так понял, что Вы предлагаете на таблицы, которые потенциально будут ссылаться на нужную мне таблицу ..., повесить триггеры и всякий раз либо увеличивать либо уменьщать на 1 значение поля в тбл. ... .
Это конечно здорово, но при добавлении в тбл. данных через select триггер отрабатывает тоько один раз.
Кроме того, на эту тбл. ссылаются таблицы, к которым я не имею отношение и не могу ни добавлять и убирать из них ничего. Я должен обхотиться только определенными тбл. БД, а ссылки на эту злосчастную тбл... не только у меня.
Возможно, я Вас неверно понял... Поэтому, если Вы имели ввиду что-то другое, то пожалуйста поясните.
Хотя я никогда не слышал о тригерах, отрабатывающих на RelationShip/
заранее спасибо.
Особенно буду признателен за разъяснение принципа срабатывания ключей FK_...

P.S.: что же касается тормозов, то сами посудите...
Таблица, на которую ссылаются 8 других таблиц. В 5 из них объем превышает 500 тыс. записей. В остальных: от 10 000 до 50 000 записей. В самой этой таблице около 10 000 записей. Вот и посчитайте, сколько будет отрабатываться запрос по таблице в 10 000 записей с поиском для каждой записи искомых в 8 таблицах вышеуказанного объема.
Индексы индексами, .... а тормоза тормозами... :((((
20 апр 03, 14:29    [179594]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
Mik Prokoshin
Member

Откуда: Барнаул
Сообщений: 1240
А в таком случае может Вам проще задуматься про функционал и useability процедуры удаления ? К примеру, если нажата кнопочка "удаление записи", сервак это дело проверяет некоторое время и удаляет (или еще там чего делает). Проблемы возникают, если надо так удалять 10-100-.. записей ежедневно. Но для таких случаев обычно делается групповое удаление, по которому организовывается уже интерфейс, технически работающий с данными одним запросом. Либо предварительно делается запрос типа "распечатка неиспользуемых записей справочника" и тогда можно опять же сделать групповое удаление с полной проверкой, либо организационно повесить это дело на исполнителя. Обычно я использую сочетание распечатки с проверкой результата попытки удаления (это как раз снимает необходимость при заходе в подтверждение удаления каждой записи, проверять все ссылки предварительно).
20 апр 03, 15:03    [179600]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
Glory
Member

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

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

Во втором случае, вам придется делать запросы к дочерним таблицам. И 50000 записей - это небольшой объем. И даже 500000 - не смертельный. А насчет индексов: наличие индекса - это одно, его актуальность - это другое, а использование его в запросе - это вообще третье.

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

В SQL2000 кстати появились каскадные операции удаления/обновления. Можно рассмотреь и такой вариант.
20 апр 03, 15:19    [179604]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
vap
Member

Откуда:
Сообщений: 487
Добавьте в главную таблицу столбец учета ссылок ref, один общий или для каждой таблицы. И сделайте примерно такой тригер для каждой ссылающейся таблицы.

ALTER TRIGGER XXX ON table1

FOR INSERT, UPDATE, DELETE AS

UPDATE MainTable SET ref = ref + 1 FROM inserted where MainTable.ID= inserted.ID
UPDATE MainTable SET ref = ref - 1 FROM deleted where MainTable.ID= deleted.ID

RETURN
20 апр 03, 15:19    [179605]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
Kavi
Member

Откуда: Москва
Сообщений: 6
Ну, что касается попытки удаления записи из таблицы и анализа ошибки, то тут не поспоришь. Весьма надежно и доступно. Только вот практика дала следующие результаты: Для реализации нужно создавать курсор. (Это уже падение скорости на порядок). Далее - сама операция удаления. . Разбор ошибки дело нехитрое. Код отработки ключа в MS SQL 2000 = Error № 547
но для того, чтобы случайно не удалилась запись, которая может быть удалена, приходится использовать транзакцию. Это, извините снижение скорости еще в несколько раз. Короче, труба дело :(((
Ладно, Вы хоть мне объясните (поподробнее, если можно, принцип работы ключа FK_...). Что там делается внутри сервера. В какие системные тбл. заносятся данные и какие. Доходчивой литературы я на эту тему не нашел. Вот и приходится спрашивать у добрых людей как и что...
Ну ладно, чего делать-то????...
20 апр 03, 17:08    [179615]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Для реализации нужно создавать курсор. (Это уже падение скорости на порядок). Далее - сама операция удаления. .

Какой курсор ????
DELETE maintable -> Error -> Разбор сообщения ->Отображение сообщения пользователю "Удалите записи из дочерней таблицы ...." ->какие-то действия пользователя -> к началу цикла.

Храниться, то ясно где - в системных таблицая sysreferences, syscolumns. А "что у ней унутри" - наверное какой-то "думатель".


Еще раз напомню про автоматические каскадные операции в MS SQL 2000.
20 апр 03, 17:26    [179620]     Ответить | Цитировать Сообщить модератору
 Re: Как определить наличие ссылок на запись в таблице без exists (not exists) ?  [new]
V. Motchulsky
Guest
>Это конечно здорово, но при добавлении в тбл. данных через select триггер отрабатывает тоько один раз.
Стоит всего лишь написать правильно триггер. Тоесть, если вставляется несколько записей - в триггере их сгруппировать и просуммировать.
20 апр 03, 21:15    [179640]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить