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

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

28.10.2011, 22:21. Показов 19814. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru