Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Каскадное удаление данных, Базы данных 
V
    Опции темы
SunRaider
Дата 13.12.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 10.5.2007

Репутация: нет
Всего: -1



Такой вопрос. В базе есть две таблицы "Покупатели" и "Договоры". Я связываю их с помощью MasterFields. Покупатели - master, Договоры - detail. Соответственно таблицы выводятся в два DBGrid'a. Т.е. при установке курсора в первом на покупателе, во втором отображаются все его договоры. 

Вопрос следующий: как сделать каскадное удаление данных из этих двух таблиц? Т.е. чтобы при удалении одного из покупателей удалялись и все его договоры. 

Заранее спасибо.
PM MAIL   Вверх
Валерия
Дата 13.12.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: нет
Всего: 8



А в MasterFields разве нет при создании внешнего индекса (так называемой "связи") галочки "каскадное удаление данных" или подобное?
PM MAIL   Вверх
jonie
Дата 13.12.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
SunRaider
Дата 13.12.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 10.5.2007

Репутация: нет
Всего: -1



Валерия, там открывается Field Link Designer и там можно только указать поле, по которому осуществляется связь. Или это руками надо дописывать? 

jonie, не понял идеи. Можете конкретизировать?
PM MAIL   Вверх
Dmi3ev
Дата 13.12.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

jonie, не понял идеи. Можете конкретизировать? 

имеется в виду, что есть триггеры. Триггер - это процедура, которая срабатывает автоматически после совершения какого-то действия. Например:
Код

CREATE TRIGGER DelA FOR A
ACTIVE
AFTER DELETE
         AS
         BEGIN
           DELETE FROM B WHERE А.field1=B.field2;
         END

В данном примере после удаления в таблице А записи, срабатывает триггер, который удаляет записи в таблице B, которые относятся к удаляемой записи в таблице A.
Вот примерная суть того, что хотел сказать jonie. То, что происходит в данном примере называется каскадным удалением.

Добавлено через 7 минут и 38 секунд
Если у Вас ничего не получается, можно тупо sql запросом сделать:
Код

DELETE FROM B WHERE А.field1=B.field2;

и когда вы удаляете из А данные просто использовать этот запрос (конечно динамический, А.field1 будет меняться).  



--------------------

PM MAIL   Вверх
SunRaider
Дата 13.12.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 10.5.2007

Репутация: нет
Всего: -1



Dmi3ev, а код для триггера был дан с учетом MS SQL Server? Потому что он упорно пишет: "Неправильный синтаксис около конструкции FOR". 

Попробовал написать такой же запрос по примеру из MSDN: 

Код
CREATE TRIGGER DelA 
on dbo.ПОКУПАТЕЛЬ
For delete
         AS
         BEGIN
           DELETE FROM ДОГОВОР WHERE ПОКУПАТЕЛЬ.КОД_ПОК=ДОГОВОР.КОД_ПОК;
         END


на что получил такую ошибку: 

Код
Сообщение 4104, уровень 16, состояние 1, процедура DelA, строка 6
Не удалось привязать составной идентификатор "ПОКУПАТЕЛЬ.КОД_ПОК".


Кстати, такую же ошибку он выдает и при попытке выполнения второго приведенного Вами запроса.
PM MAIL   Вверх
Dmi3ev
Дата 14.12.2008, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

Dmi3ev, а код для триггера был дан с учетом MS SQL Server?

нет, я просто раскрыл суть. я же не телепат, не знал, что Вы используете)))
а как писать триггеры, особенно такие простые, много где написано, наверное... можно и поискать...


--------------------

PM MAIL   Вверх
Michrutka
Дата 14.12.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.2.2008

Репутация: нет
Всего: нет



Сейчас под рукой нет MSSQL
но так на взгляд попробуй
Код

CREATE TRIGGER DelA 
on dbo.[ПОКУПАТЕЛЬ]
After delete
         AS
       DELETE FROM ДОГОВОР WHERE dbo.[ПОКУПАТЕЛЬ].[КОД_ПОК]=dbo.[ДОГОВОР].[КОД_ПОК]


Это сообщение отредактировал(а) Michrutka - 14.12.2008, 00:30
PM MAIL   Вверх
SunRaider
Дата 14.12.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 10.5.2007

Репутация: нет
Всего: -1



Michrutka, та же самая ошибка: 

Код
Сообщение 4104, уровень 16, состояние 1, процедура DelA, строка 5
Не удалось привязать составной идентификатор "dbo.ПОКУПАТЕЛЬ.КОД_ПОК".

PM MAIL   Вверх
Dmi3ev
Дата 14.12.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

Michrutka, та же самая ошибка: 

Советую почитать, как создается триггер. Помимо этого для того, чтобы триггер сработал необходимы некоторые условия... Про специфику триггеров в MS SQL почитать стоит, я думаю... Ведь много информации, например, первое, что открылось уже может помочь... Почитайте...
http://www.sql.ru/forum/actualthread.aspx?tid=428247


--------------------

PM MAIL   Вверх
SunRaider
Дата 24.12.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 10.5.2007

Репутация: нет
Всего: -1



Dmi3ev, спасибо, реально помогло. Мог бы, обязательно поставил +1.
PM MAIL   Вверх
orthrus
Дата 25.12.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

Репутация: 4
Всего: 16



Цитата(SunRaider @  24.12.2008,  18:59 Найти цитируемый пост)
Мог бы, обязательно поставил +1. 

Я в этом тебе помогу


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
SunRaider
Дата 25.12.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 10.5.2007

Репутация: нет
Всего: -1



orthrus, спасибо и Вам)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.