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

Триггеры

25.11.2020, 13:34. Показов 1629. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуй, IT-сообщество. Я абсолютно сломал себе голову с созданием данного триггера:

При удалении информации о покупателе триггер переносит
его историю покупок в таблицу «История покупок»
Дело в том, что я удаляю из одной таблицы, а данные в историю нужно занести из другой. И Management Studio начинает ругаться и выдавать вот такую ошибку:

Msg 547, Level 16, State 0, Procedure tg_purchase_history, Line 11 [Batch Start Line 68]
The DELETE statement conflicted with the REFERENCE constraint “FK__PurchaseH__Clien__47DBAE45”. The conflict occurred in database “Sales_db”, table “dbo.PurchaseHistory”, column ‘ClientId’
Я написал это:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE PurchaseHistory
([Id] INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
[EmpId] INT NOT NULL FOREIGN KEY REFERENCES [Employees]([Id]),
[ClientId] INT NOT NULL FOREIGN KEY REFERENCES [Clients]([Id]),
[Product] nvarchar(MAX) NOT NULL CHECK ([Product] <> N''),
[Price] money NOT NULL CHECK ([Price] >= 0.0) DEFAULT 0.0,
[SDate] DATE NOT NULL CHECK (SDate <= getdate()) DEFAULT getdate())
GO
 
CREATE TRIGGER tg_purchase_history ON Clients
instead OF DELETE
AS
BEGIN
INSERT INTO PurchaseHistory(EmpId,ClientId,Product,Price,SDate)
SELECT EmpId,ClientId,Product,Price,SDate
FROM SaleOfGoods sg JOIN deleted d
ON d.Id=sg.ClientId
DELETE FROM Clients
WHERE Id IN (SELECT Id FROM deleted)
END
Но перепробовал все и оно все равно не работает.

Подскажите пожалуйста, как мне поступить. Может стоит переделать бд? Или что-то еще? Заранее спасибо.

База данных:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
USE [master];
GO
 
IF db_id('Sales_db') IS NOT NULL
BEGIN
DROP DATABASE [Sales_db];
END
GO
 
CREATE DATABASE [Sales_db];
GO
 
USE [Sales_db];
GO
CREATE TABLE [Employees]
(
[Id] INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
[Name] nvarchar(MAX) NOT NULL CHECK ([Name] <> N''),
[Surname] nvarchar(MAX) NOT NULL CHECK ([Surname] <> N''),
[Patronymic] nvarchar(MAX) NOT NULL CHECK ([Patronymic] <> N''),
[Email] nvarchar(MAX) NOT NULL CHECK ([Email]<>N''),
[Phone_Number] nvarchar(50) NOT NULL CHECK (Phone_Number <> N''))
GO
INSERT [Employees](Surname,Name,Patronymic,Email,Phone_Number)VALUES
(N'Petrova',N'Maria',N'Leonidovna',N'masha@gmail.com',N'050-255-00-01'),
(N'Fokina',N'Elena',N'Alekseevna',N'lena@gmail.com',N'067-255-00-01'),
(N'Lapina',N'Olga',N'Ivanovna',N'olya@gmail.com',N'063-255-00-01')
GO
CREATE TABLE [Clients]
(
[Id] INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
[Name] nvarchar(MAX) NOT NULL CHECK ([Name] <> N''),
[Surname] nvarchar(MAX) NOT NULL CHECK ([Surname] <> N''),
[Patronymic] nvarchar(MAX) NOT NULL CHECK ([Patronymic] <> N''),
[Email] nvarchar(MAX) NOT NULL CHECK ([Email]<>N''),
[Phone_Number] nvarchar(50) NOT NULL CHECK (Phone_Number <> N''))
GO
INSERT [Clients](Surname,Name,Patronymic,Email,Phone_Number)VALUES
(N'Ivanov',N'Ivan',N'Ivanovich',N'ivan@gmail.com',N'066-356-56-84'),
(N'Petrov',N'Petr',N'Petrovich',N'petr@gmail.com',N'068-351-45-81'),
(N'Sergeev',N'Sergey',N'Sergeevich',N'sergey@gmail.com',N'098-351-45-56'),
(N'Mihaylov',N'Michael',N'Mihaylovich',N'misha@gmail.com',N'095-125-56-87'),
(N'Pupkin',N'Vasya',N'Petrovich',N'vasya@gmail.com',N'050-258-45-54')
GO
CREATE TABLE [SaleOfGoods]
(
[Id] INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
[EmpId] INT NOT NULL FOREIGN KEY REFERENCES [Employees]([Id]) ON DELETE cascade ON UPDATE cascade,
[ClientId] INT NOT NULL FOREIGN KEY REFERENCES [Clients]([Id]) ON DELETE cascade ON UPDATE cascade,
[Product] nvarchar(MAX) NOT NULL CHECK ([Product] <> N''),
[Price] money NOT NULL CHECK ([Price] >= 0.0) DEFAULT 0.0,
[SDate] DATE NOT NULL CHECK (SDate <= getdate()) DEFAULT getdate())
GO
INSERT [SaleOfGoods](EmpId,ClientId,Product,Price,SDate)VALUES
(1,1,N'Laptop',500,'2020-01-02'),(1,5,N'Book',10,'2020-08-22'),(2,3,N'TV',200,'2020-02-23'),
(3,4,N'Sneakers',100,'2020-10-25'),(2,4,N'Jacket',50,'2020-11-01'),(1,4,N'Smartphone',200,'2020-10-01'),
(2,5,N'Chair',100,'2020-09-28'),(1,2,N'Glasses',50,'2020-07-23'),(1,3,N'Dress',100,'2020-03-17')
GO
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.11.2020, 13:34
Ответы с готовыми решениями:

Триггеры
Подскажите пожалуйста! Как сделать, чтобы правильно работало? (сотрудник должен быть не моложе 18 лет) CREATE TRIGGER Mobile1 ON...

Триггеры
Помогите созданием триггера. у меня выходить конфликт. Как можно создать работающий триггер. INSERT / UPDATE / DELETE например если...

Триггеры
Добpый дeнь! Помогитe пожaлуйстa нaписaть тpиггepы. Тpиггep, котоpый пpи удaлeнии дaнных о товape (Tovars), копиpуeт всю инфоpмaцию о...

4
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
25.11.2020, 14:14
Цитата Сообщение от archikrim_38 Посмотреть сообщение
SQL
1
[ClientId] INT NOT NULL FOREIGN KEY REFERENCES [Clients]([Id]),
Понимаете, что это означает?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 23
25.11.2020, 14:37  [ТС]
Это внешний ключ, который ссылается на таблицу клиентов и при удалении клиента удаляется и ссылка. Но как тогда сделать этот триггер. Может стоит по другому сделать таблицу с Историей? Но как ее сделать, чтобы в нее записывались актуальные данные. Это вообще возможно?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
25.11.2020, 14:45
Лучший ответ Сообщение было отмечено archikrim_38 как решение

Решение

Цитата Сообщение от archikrim_38 Посмотреть сообщение
Это внешний ключ, который ссылается на таблицу клиентов и при удалении клиента удаляется и ссылка.
Так будет, если указать для ссылки on delete cascade. Только тогда зачем заполнять таблицу PurchaseHistory, если следующим шагом все вставленное будет удалено?
Цитата Сообщение от archikrim_38 Посмотреть сообщение
Но как ее сделать, чтобы в нее записывались актуальные данные.
Варианты:
- не ссылаться на клиентов
- не удалять физически клиента, а делать пометку, что он удален.
1
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 23
25.11.2020, 15:10  [ТС]
Спасибо большое! Добавил в таблицу с Клиентами столбец Note c NULL. И при удалении записываю туда пометку. И все получается очень логично вроде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2020, 15:10
Помогаю со студенческими работами здесь

Триггеры
Будьте добры, подкиньте студенту идей для написания триггеров. Нужно по 3 триггера на транзакции удаления и редактирования. Было бы хорошо...

Триггеры
Здравствуйте! Мне нужно написать триггер, который при обновлении отклоняет изменения, если в таблице есть связанные данные. Дело в...

Триггеры
Разбираюсь в триггерах, хотелось бы получить наглядный пример) заранее благодарю за помощь) Имеем следующие таблицы: book...

Триггеры и C#
Добрый день.Возник вопрос по триггерам.Есть программа написанная в C#,которая реализует просмотр и изменение таблиц из sql и есть триггер...

Триггеры не работают
Код триггера не менял , да и базу данных почти не трогал ,данные заполнял через приложение работали отлично в VS2010 Замечаю ,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru