С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
[FENIX]
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 227
1

Каскадное обновление таблиц

17.12.2016, 16:24. Просмотров 1051. Ответов 11

Всем привет! Народ, помогите, не могу правильно составить SQL-запрос.
Вот задача:

Есть таблицы:
«Заявки» с полями («Код заявки» (ключ), «Код клиента (внешний ключ)», «Название», «Адрес»)
«Клиенты» с полями («Код клиента» (ключ), «Название», «Адрес»)
Таблицы связаны по ключевым полям.

Нужно написать запрос на SQL, выполняющий обновление «Адреса» заявки таблицы «Заявки на доставку» значениями «Адреса» из таблицы «Клиенты». Т.е. если мы обновляем значение поля Клиенты.Адрес, то автоматически должно меняться поле Адрес нужной записи в таблице "Заявки".

Пока написал вот это:

SQL
1
2
3
4
5
6
CREATE TRIGGER Tr1 ON Clients
FOR UPDATE
AS 
IF UPDATE(Address)
    UPDATE Requests
    SET Address=(SELECT Address FROM inserted WHERE inserted.ID=Requests.Client_ID_FK)
Но этот запрос обновляет ВСЕ записи в таблице Заявки, а не только нужную. Помогите пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2016, 16:24
Ответы с готовыми решениями:

Каскадное удаление из 3-х таблиц
Здравствуйте! У меня (MSSQL Server) есть 3 таблицы: countries (id, name), towns...

Триггер (каскадное удаление и обновление)
Здравствуйте, мне нужно создать один триггер, в котором будет каскадное...

Обновление связанных таблиц
Собственно возникла такая вот проблема. Пробовал в свойствах связей задавать...

Insert и обновление связанных таблиц
Тему назвал неправильно, не Insert а UPDATE. Есть две таблицы...

Автоматическое обновление таблиц с использованием агента
Есть сервер На нем находятьcя 2 базы данных SIMTC и AD_LIB Основная база...

11
YuryK
1031 / 848 / 337
Регистрация: 08.12.2016
Сообщений: 3,283
17.12.2016, 18:12 2
какое отношение изменение адреса клиента имеет отношение к адресу заявки? Т.е. если клиент переехал, будем считать, что и ремонт ему в прошлом году сделали по новому адресу?

А если Адрес это атрибут Клиента и для заявки он абсолютно не важен, кроме как на момент исполнения заявки, то делать этому атрибуту в таблице Заявки нечего, его всегда можно извлечь из таблицы "Клиенты".
0
[FENIX]
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 227
17.12.2016, 18:18  [ТС] 3
Я понимаю. Тут имеется ввиду "Заявки на доставку", т.е. если у клиента меняется адрес (в таблице Клиенты), то и в таблице Заявки этот адрес должен поменяться. Практического смысла может в этом и нет, мне просто запрос нужно правильно составить на каскадное обновление таблиц.
0
YuryK
1031 / 848 / 337
Регистрация: 08.12.2016
Сообщений: 3,283
17.12.2016, 18:27 4
Правильно оставить адрес только у клиента, у заказа его быть не может, если есть "Клиенты".
Поэтому мне религия не позволяет рассказать про триггеры

Намекну, что UPDATE обязательно должен быть WHERE в котором и должны быть определены записи, который UPDATE затронет. У тебя его нет, поэтому правятся все записи таблицы
0
[FENIX]
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 227
17.12.2016, 18:32  [ТС] 5
Я понимаю, но задача жестко прописана, что есть вот такие вот таблицы, и вот такие вот поля )) Я менять не могу это.
Помоги хотя бы WHERE правильно подправить, если не сложно
0
YuryK
1031 / 848 / 337
Регистрация: 08.12.2016
Сообщений: 3,283
17.12.2016, 18:46 6
Если у клиента поменялся адрес, то это коснется только его следующих заказов, чего изменять каскадно? Того чего в базе нет?

Ладно бы обратная задача: При оформлении заказа мы выбрали клиента, адрес проставился из "Клиенты" и клиент сказал, что адрес поменялся, тогда изменяя адрес в Заказе мы в триггере заменяем адрес и в "Клиенты" и теперь у Клиента будет новый адрес, который мы впредь будем использовать в заказах.

Цитата Сообщение от [FENIX] Посмотреть сообщение
но задача жестко прописана,
кто это такой прописыватель задач. Пойми сам и объясни ему, что он заблуждается
0
[FENIX]
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 227
17.12.2016, 18:52  [ТС] 7
Это бесполезно что-то объяснять, ладно, и на этом спасибо
0
YuryK
1031 / 848 / 337
Регистрация: 08.12.2016
Сообщений: 3,283
17.12.2016, 19:05 8
T-SQL
1
2
3
4
5
6
7
8
CREATE TRIGGER Tr1 ON Clients
FOR UPDATE
AS 
IF UPDATE(Address)
    UPDATE Requests SET Address = inserted.Address
    FROM 
     inserted
    JOIN Requests ON inserted.ID=Requests.Client
как правильно поля называются не знаю, т.к. в описании таблицы ты их называл совсем иначе
0
[FENIX]
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 227
17.12.2016, 19:09  [ТС] 9
Спасибо! Я сделал, но немного по-другому

SQL
1
2
3
4
5
6
7
8
CREATE TRIGGER Tr1 ON Clients
FOR UPDATE
AS 
IF UPDATE(Address)
    UPDATE a
    SET a.Address= b.Address
        FROM Requests a
        JOIN inserted b ON a.Client_ID_FK = b.ID
0
[FENIX]
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 227
17.12.2016, 19:12  [ТС] 10
Вот структура (во вложении).
0
Изображения
 
YuryK
1031 / 848 / 337
Регистрация: 08.12.2016
Сообщений: 3,283
17.12.2016, 19:18 11
Цитата Сообщение от [FENIX] Посмотреть сообщение
Спасибо! Я сделал, но немного по-другому
отличий не заметил
0
[FENIX]
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 227
17.12.2016, 19:21  [ТС] 12
Не суть, спасибо большое!
0
17.12.2016, 19:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2016, 19:21

Каскадное удаление
Доброго времени суток, я не знаток баз данных, но появилась задача которую...

Каскадное удаление
Доброго времени суток! Проблема следующая, использую MySQL Workbench 6.0...

Каскадное удаление
Есть маленькая база, в ней связанные таблицы, работаю с ней через орм. Вопрос...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru