Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/107: Рейтинг темы: голосов - 107, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 10

Создать триггер на 2 таблицы

28.10.2011, 22:21. Показов 19859. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Нужна помощь в составлении триггера или же процедуры (желательно триггера/ов) на 2 таблицы в базе данных.
Есть таблица "Detzakaz" и таблица "Products" (Products - это, по-сути, склад). В "Detzakaz" оформляется количество (dz_kol) определенного товара из таблицы "Products". В "Products" есть количество данного товара, н-р, штук 30 (Pr_Kol=30). Так вот, нужен триггер/ы, который будет добавлять количество определенного товара из "Detzakaz" в "Products".
В "Detzakaz" много товаров определенного вида, который есть в "Products". Может через цикл делать, чтобы для каждого товара прибавлялось количество в "Products"?

Вот такая задача...

Заранее благодарю за помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2011, 22:21
Ответы с готовыми решениями:

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это предприятие с именем таблицы База практик в...

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это предприятие с именем таблицы База практик в...

Создать триггер, который в созданной таблице STAT_PRODAVES модифицирует значения в столбцах таблицы
Ребят, есть задача такого типа: Создать триггер, который в созданной таблице STAT_PRODAVES со столбцами FIO, KOL_DETECTIV,...

14
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
28.10.2011, 23:54
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
create trigger Ins_Detzakaz
on Detzakaz for insert
as
update Products set Pr_Kol = Pr_Kol + i.dz_kol
from inserted i
inner join Products p on p.PID = i.PID
go
 
create trigger Del_Detzakaz
on Detzakaz for delete
as
update Products set Pr_Kol = Pr_Kol - 
(select sum(d.dz_kol) from deleted d left join Products p on p.PID = d.PID group by d.PID)
from deleted d
where d.PID = Products.PID
go
 
create trigger Upd_Detzakaz
on Detzakaz for update
as
update Products set Pr_Kol = Pr_Kol
- (select sum(d.dz_kol) from deleted d left join Products p on p.PID = d.PID group by d.PID)
+ (select sum(i.dz_kol) from inserted i left join Products p on p.PID = i.PID group by i.PID) 
from deleted d 
inner join inserted i on i.PID = d.PID
where Products.PID = d.PID and Products.PID = i.PID
go
PID - в Products PK
PID - в Detzakaz FK с ссылкой нв PK в Products
Все изменения в любых количествах в таблице Detzakaz будут влиять на таблицу Products

Добавлено через 36 минут
Немножко не так, не учел update и delete по нескольким ключам!
Вот так вот правильно :

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
create trigger Ins_Detzakaz
on Detzakaz for insert
as
update Products set Pr_Kol = Pr_Kol + i.dz_kol
from inserted i
inner join Products p on p.PID = i.PID
go
 
create trigger Del_Detzakaz
on Detzakaz for delete
as
update Products set Pr_Kol = Pr_Kol - 
isnull((select sum(d.dz_kol) from deleted d where d.PID = Products.PID group by d.PID),0)
go
 
create trigger Upd_Detzakaz
on Detzakaz for update
as
update Products set Pr_Kol = Pr_Kol
- isnull((select sum(d.dz_kol) from deleted d where d.PID = Products.PID group by d.PID),0)
+ isnull((select sum(i.dz_kol) from inserted i where i.PID = Products.PID group by i.PID),0) 
go
2
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 10
29.10.2011, 00:40  [ТС]
Celly
Благодарю!

Буду разбираться.
0
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 10
30.10.2011, 23:53  [ТС]
Нужна еще помощь.

Есть у меня таблица Detzakaz и Zakaz. В таблице Detzakaz есть количество (dz_kol), цена за единицу (dz_cost_per_unit), и сумма за количество данного товара (dz_total_sum). Сумма подсчитывается произведением dz_total_sum=dz_kol*dz_cost_per_unit. А в Zakaz может быть несколько видов товара, и в этой таблице есть dz_itog_sum (Итоговая сумма заказа, высчитывается как @z_itog_sum = (select sum(dz_total_sum)). Вот так вот.

Через процедуру у меня это получилось сделать. Но exec каждый раз делать - ругается MS SQL. Надо запись до процедуры вводить. После уже не хочет обновлять.

Помогите через триггер это сделать.

Код процедур:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--Процедура заполнения dz_total_sum в таблице Detzakaz
CREATE proc dz_total_sum AS UPDATE Detzakaz SET dz_total_sum = dz_kol * dz_cost_per_unit
EXEC dz_total_sum
 
--Процедура заполнения z_itog_sum в таблице Zakaz
CREATE proc vvod_z_itog_sum
(@Zakaz_Id INT) AS DECLARE @z_itog_sum money;
SELECT @z_itog_sum = (SELECT SUM(dz_total_sum) FROM Detzakaz WHERE Zakaz_Id=@Zakaz_Id)
UPDATE Zakaz SET z_itog_sum=@z_itog_sum WHERE Zakaz_Id=@Zakaz_Id
 
EXEC vvod_z_itog_sum 1
EXEC vvod_z_itog_sum 2
EXEC vvod_z_itog_sum 3
EXEC vvod_z_itog_sum 4
EXEC vvod_z_itog_sum 5
Добавлено через 46 минут
Цитата Сообщение от Ssha Посмотреть сообщение
Нужна еще помощь.

Есть у меня таблица Detzakaz и Zakaz. В таблице Detzakaz есть количество (dz_kol), цена за единицу (dz_cost_per_unit), и сумма за количество данного товара (dz_total_sum). Сумма подсчитывается произведением dz_total_sum=dz_kol*dz_cost_per_unit. А в Zakaz может быть несколько видов товара, и в этой таблице есть dz_itog_sum (Итоговая сумма заказа, высчитывается как @z_itog_sum = (select sum(dz_total_sum)). Вот так вот.

Через процедуру у меня это получилось сделать. Но exec каждый раз делать - ругается MS SQL. Надо запись до процедуры вводить. После уже не хочет обновлять.

Помогите через триггер это сделать.

Код процедур:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--Процедура заполнения dz_total_sum в таблице Detzakaz
CREATE proc dz_total_sum AS UPDATE Detzakaz SET dz_total_sum = dz_kol * dz_cost_per_unit
EXEC dz_total_sum
 
--Процедура заполнения z_itog_sum в таблице Zakaz
CREATE proc vvod_z_itog_sum
(@Zakaz_Id INT) AS DECLARE @z_itog_sum money;
SELECT @z_itog_sum = (SELECT SUM(dz_total_sum) FROM Detzakaz WHERE Zakaz_Id=@Zakaz_Id)
UPDATE Zakaz SET z_itog_sum=@z_itog_sum WHERE Zakaz_Id=@Zakaz_Id
 
EXEC vvod_z_itog_sum 1
EXEC vvod_z_itog_sum 2
EXEC vvod_z_itog_sum 3
EXEC vvod_z_itog_sum 4
EXEC vvod_z_itog_sum 5
Update

Вроде, разобрался.
SQL
1
2
3
4
5
CREATE TRIGGER Ins_Detzakaz_total_sum
ON Detzakaz FOR INSERT
AS
UPDATE Detzakaz SET dz_total_sum = dz_kol*dz_cost_per_unit
GO
Вот такой код. Только, сейчас процедура, выше написанная, препятствует выполнению данного триггера.
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
31.10.2011, 00:19
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- Добавте в существующий триггер конструкцией Alter или создайте заново(предварительно удалив существующие)...
CREATE TRIGGER Ins_Detzakaz
ON Detzakaz FOR INSERT
AS
UPDATE Products SET Pr_Kol = Pr_Kol + i.dz_kol
FROM inserted i
INNER join Products p ON p.PID = i.PID
EXEC(dz_total_sum) -- вызываем процедуру для подсчёта суммы по составляющим заказа
UPDATE Zakaz SET dz_itog_sum = dz_itog_sum + i.dz_total_sum
FROM inserted i
INNER join Zakaz z on z.ZID = i.ZID
go
 
CREATE TRIGGER Del_Detzakaz
ON Detzakaz FOR DELETE
AS
UPDATE Products SET Pr_Kol = Pr_Kol - 
isnull((SELECT SUM(d.dz_kol) FROM deleted d WHERE d.PID = Products.PID GROUP BY d.PID),0)
EXEC(dz_total_sum) -- вызываем процедуру для подсчёта суммы по составляющим заказа
UPDATE Zakaz SET dz_itog_sum = dz_itog_sum - 
isnull((SELECT SUM(d.dz_total_sum) FROM deleted d WHERE d.ZID = Zakaz.ZID GROUP BY d.ZID),0)
go
 
CREATE TRIGGER Upd_Detzakaz
ON Detzakaz FOR UPDATE
AS
UPDATE Products SET Pr_Kol = Pr_Kol
- isnull((SELECT SUM(d.dz_kol) FROM deleted d WHERE d.PID = Products.PID GROUP BY d.PID),0)
+ isnull((SELECT SUM(i.dz_kol) FROM inserted i WHERE i.PID = Products.PID GROUP BY i.PID),0) 
EXEC(dz_total_sum) -- вызываем процедуру для подсчёта суммы по составляющим заказа
UPDATE Zakaz SET dz_itog_sum = dz_itog_sum
- isnull((SELECT SUM(d.dz_total_sum) FROM deleted d WHERE d.ZID = Zakaz.ZID GROUP BY d.ZID),0)
+ isnull((SELECT SUM(i.dz_total_sum) FROM inserted i WHERE d.ZID = Zakaz.ZID GROUP BY i.ZID),0)
go
где ZID - ID вашего заказа
Так же как вариант можете сделать вычисляемый столбец... но только прийдётся удалить
колонку detzakaz.dz_total_sum и добавить заново:
T-SQL
1
alter table Zakaz add dz_total_sum as dz_kol * dz_cost_per_unit
Это поможет вам избежать вызова процедуры в триггере! Про плюсы и недостатки вычисляемых столбцов почитайте сдесь : http://msdn.microsoft.com/ru-r... 91250.aspx
1
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 10
31.10.2011, 14:53  [ТС]
Celly
Огромное Вам Благодарю!
Буду разбираться.

Добавлено через 14 часов 31 минуту
Уважаемый Celly. Не могли бы Вы помочь еще в одном деле?
Есть таблица Products, в ней есть поле (Pr_kol - это кол-во определенного товара). И есть таблица Detzayavka, в ней есть поле (dza_kol - кол-во отпускаемого товара).
Нужен триггер, если в Products не хватает товара, выписываемого в Detzayavka - чтобы выдавало запись "Запись невозможна. На складе нет такого количества".

Заранее благодарю.

P.S. С теми триггерами разобрался. Работает как надо. Благодарю!
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
31.10.2011, 16:02
T-SQL
1
2
3
4
5
6
7
8
9
10
create trigger Instead_Ins_Detzayavka on Detzayavka
instead of insert
as
begin
if exists(select 1 from inserted i inner join Products p on p.PID = i.PID 
           where p.Pr_kol < (select sum(dza_kol) from Detzayavka where PID = i.PID) + i.dza_kol)
    raiserror('Запись невозможна. На складе нет такого количества',10,10)
-- Сообщение выведится в закладке сообщений managemt studio, запись не вставится в Detzayavka
end
go
0
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 10
31.10.2011, 19:58  [ТС]
Celly, последний код не работает. Т.е., я не могу занести запись в Detzayavka - никакую. Вношу - пишет: "Строки обновлены". А в самой таблице нет данных. Я снова вношу те же записи - "Успешно обновлено", а данных нет..
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
31.10.2011, 20:03
Проверте количество Pr_kol в таблице Products и сравните с суммой dza_kol из таблицы Detzayavka!
значение pr_kol не должно быть меньше суммы dza_kol!!!

Да... Забыл о самом главном

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TRIGGER Instead_Ins_Detzayavka ON Detzayavka
instead OF INSERT
AS
BEGIN
IF exists(SELECT 1 FROM inserted i INNER join Products p ON p.PID = i.PID 
           WHERE p.Pr_kol < (SELECT SUM(dza_kol) FROM Detzayavka WHERE PID = i.PID) + i.dza_kol)
        RAISERROR('Запись невозможна. На складе нет такого количества',10,10)
ELSE
INSERT INTO Detzayavka SELECT * FROM inserted
-- Сообщение выведится в закладке сообщений managemt studio, запись не вставится в Detzayavka
END
go
теперь будет работать!
1
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 10
08.11.2011, 23:46  [ТС]
Здравствуйте!

Разъясните пожалуйста. В своей БД я создал пользователей, роли и присвоил им права. Роль "администраторы" с 1-м пользователем. И роль "Менеджеры" - с 4-мя пользователями. У каждого человека в роли свой логин и пароль. Как проверить работоспособность прав, которые я задал?
БД связываю с графическим приложением, в Visual Studio 2010. Как мне организовать вход по логину и паролю, определенного пользователя (как выше описал)?

Заранее благодарю.
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
09.11.2011, 18:41
Для проверки пройдите аутентификацию через management studio и попробуйте поманипулировать с таблицами на которые вы не давали пермишены.
Наризуйте форму где пользователь будет вводить пароль и логин своей учётной записи SQL и подставляйте введённые данные в строку подключения. И там уже в блоке try..catch проверяйте правильность введённых данных когда будет пытатся подключится к БД!
0
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 10
10.11.2011, 09:06  [ТС]
Через MS SQL management studio, я аутентификацию пройти не смог. Ошибку выдает.

Что я делаю не так?
0
 Аватар для Celly
158 / 148 / 25
Регистрация: 23.01.2011
Сообщений: 319
10.11.2011, 17:50
А у вас случайно не экспресс версия стоит? Если да, то неполучится у вас юзеров натыкать по идее... нужно ставить девелопер хотябы... Вам необходимо при установке будет указать подключение к серверу с SQL Server Authentification.
0
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 10
10.11.2011, 18:18  [ТС]
Enterprice версия стоит.
Впринципе, как в приложении юзернеймы и пароли реализовать я понял.
Благодарю за помощь.

P.S. Еще обращусь.
0
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 10
20.03.2018, 09:06
Здравствуйте! Спасибо за способ решения! Очень помогло! Вопрос по обновлению записи: у меня не обновляется запись, потому что код в таблице еще переносится в другую! А при обновлении он жалуется, что данные в связанной таблице не обновляются. По суте, код я не меняю, а жалуется. Я думаю, что нужно его обновить (или пересоздать заново запись с теми же параметрами), но как это сделать? И плюс к тому же, это ключевое поле (второй ключ). На картинке две таблицы, которые связаны по ключу "kid" и "nkid" и на это связь он жалуется. Подскажите пожалуйста!

Заранее благодарю за помощь!!!)))
Миниатюры
Создать триггер на 2 таблицы   Создать триггер на 2 таблицы  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.03.2018, 09:06
Помогаю со студенческими работами здесь

Как создать триггер который обновляет запись в таблицы при добавлении записи в другую таблицу
Всем привет, нужна помощь с триггером, столкнулся с ним в первые до этого использовал процедуры, а диплом горит) История такая: ...

Триггер для таблицы
Всем привет! Есть три таблицы Книга(ид_книги, год выпуска...) Автор(ид_автора, год рождения....), Книга-Автор(ид_книги, ид_автора)....

Триггер на удаление поля таблицы
Необходимо создать триггер,который при удалении поля из таблицы Pupil удалял бы соответствующие записи из связанных таблиц Relative и...

Триггер на апдейт определенных столбцов таблицы
Добрый день. Есть таблица MaterialUnits. Единицы материалов Столбцы IDENTITY(0,1) NOT NULL, NOT NULL, NOT NULL, ...

Триггер на INSERT для другой таблицы
Нужно после вставки в таблицу CheckProduct обновить данные в другой таблице Product Пишу триггер для CheckProduct : ALTER TRIGGER...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru