2 / 2 / 0
Регистрация: 03.02.2013
Сообщений: 126

Создание триггера до удаления записи и триггера после удаления записи

24.02.2019, 16:12. Показов 3012. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть БД на рис. пишу триггер при удаление клиента что бы сначала до удаления удалилась таблица t_pledge. А после остальные связанные. Запустил из программы она удалила запись из таблицы t_pledge а остальное все на месте.

Кто может подсказать где ошибка ?

триггер до удаления:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
USE [Lombard]
GO
/****** Object:  Trigger [dbo].[delpledgeforclient]    Script Date: 24.02.2019 21:04:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
ALTER TRIGGER [dbo].[delpledgeforclient]
    ON [dbo].[t_client]
    INSTEAD OF DELETE
    AS
    BEGIN
    SET NOCOUNT ON
 
     DELETE FROM t_pledge
  WHERE t_pledge.id_client = (SELECT deleted.id_client 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
USE [Lombard]
GO
/****** Object:  Trigger [dbo].[deleldocdocandperson]    Script Date: 24.02.2019 21:06:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
ALTER TRIGGER [dbo].[deleldocdocandperson]
    ON [dbo].[t_client]
    AFTER DELETE
    AS
    BEGIN
    SET NOCOUNT ON
 
     DELETE FROM t_electro_document
      WHERE t_electro_document.id_document = (SELECT t_document.id_document FROM t_document WHERE t_document.id_person = (SELECT deleted.id_client FROM deleted) );
 
     DELETE FROM t_document
      WHERE t_document.id_person = (SELECT deleted.id_client FROM deleted) ;
 
       DELETE FROM t_person
      WHERE t_person.id_person = (SELECT deleted.id_client FROM deleted) ;
 
    END

Вызов в программе:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 SqlConnection conn = new SqlConnection();
            conn.ConnectionString = Properties.Settings.Default.LombardConnectionString1;
            conn.Open();
            try
            {
                SqlCommand client = conn.CreateCommand();
                client.CommandText = "DELETE FROM t_client WHERE id_client = @pro_id_client";
 
                client.Parameters.Add("@pro_id_client", SqlDbType.Int);
                client.Parameters["@pro_id_client"].Value = (int)dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[5].Value;
                client.ExecuteNonQuery();
 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                conn.Close();
            }
Миниатюры
Создание триггера до удаления записи и триггера после удаления записи  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.02.2019, 16:12
Ответы с готовыми решениями:

FireBird, попытка создания триггера на предотвращения удаления
Доброе время суток форумчане. Такая вот загвоздка, точнее две. Использую FireBird 2.5.4. и ibexpert Посмотрел как люди делают (и...

Создание в таблице кнопки удаления записи из БД
<?php include "config.php"; if( isset($_GET)) { $query1 = mysql_query('SELECT*FROM Books WHERE id='.$_GET); ...

Автоинкремент после удаления последней записи
Здравствуйте. Имеется таблица на MySQL. Одно из полей (к примеру, Id) - автоинкрементируемое. Если последняя из записей будет...

9
 Аватар для pincet
1653 / 1152 / 173
Регистрация: 23.07.2010
Сообщений: 6,869
24.02.2019, 16:22
каскадное удаление не предлагать?
0
2 / 2 / 0
Регистрация: 03.02.2013
Сообщений: 126
24.02.2019, 16:25  [ТС]
Можно, просто где то слышал что это не есть хорошо ? или это не так ?
0
 Аватар для pincet
1653 / 1152 / 173
Регистрация: 23.07.2010
Сообщений: 6,869
24.02.2019, 16:28
ага, а триггеры это супер. особенно , если не умеешь их готовить
0
2 / 2 / 0
Регистрация: 03.02.2013
Сообщений: 126
24.02.2019, 16:32  [ТС]
Да я и не претендую на звание "Повар года" просто хочу научиться как с ними работать, если можете что то подсказать или объяснить, даже пусть и каскадное то пожалуйста объясните, тоже лишним не будет
0
 Аватар для pincet
1653 / 1152 / 173
Регистрация: 23.07.2010
Сообщений: 6,869
24.02.2019, 16:38
каскадное удаление настраивается путем введения ограничений внешнего ключа. Достаточно широко тема раскрыта в интернетах. а с триггерами без крайней нужды не советую связываться
1
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,271
24.02.2019, 17:13
Цитата Сообщение от Wolverine_ Посмотреть сообщение
триггер до удаления:
Триггеров ДО УДАЛЕНИЯ в MSSQL НЕ СУЩЕСТВУЕТ.
"Instead Of Delete" - это триггер ВМЕСТО УДАЛЕНИЯ,
Так, как вы написали, работать не будет. Потому что из таблицы [dbo].[t_client]
вы сами должны удалить записи в триггере [dbo].[delpledgeforclient] на основе записей в псевдотаблице deleted..
Ведь этот триггер был вызван ВМЕСТО удаления!

Сравнивать в триггере со скалярным выражением (SELECT deleted.id_client FROM deleted) - грубейшая ошибка!
Ведь в deleted может быть более одной записи (миллиард!!).
Используйте JOIN deleted
1
2 / 2 / 0
Регистрация: 03.02.2013
Сообщений: 126
25.02.2019, 06:30  [ТС]
У вас не будет примера ?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,271
25.02.2019, 10:11
Цитата Сообщение от Wolverine_ Посмотреть сообщение
У вас не будет примера ?
T-SQL
1
2
3
4
5
6
7
ALTER TRIGGER [dbo].[delpledgeforclient] ON [dbo].[t_client] INSTEAD OF DELETE AS
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM deleted)
BEGIN
 DELETE c FROM [dbo].[t_client] с JOIN deleted d ON c.id_client=d.id_client;
 DELETE t_pledge WHERE id_client IN (SELECT id_client FROM deleted);
END;
Кстати, мне стало непонятно, зачем тут триггер INSTEAD OF DELETE.
Почему не FOR DELETE? Есть FOREIGN KEY?
Надо удалять в правильном порядке, если есть FOREIGN KEY.
Сначала в таблице, которая ссылается на другую, а из этой другой - потом.
1
2 / 2 / 0
Регистрация: 03.02.2013
Сообщений: 126
25.02.2019, 15:24  [ТС]
INSTEAD OF DELETE. я просто не правильно его понял, думал BEFORE.
То есть у меня получится порядок удаления: t_electro_document , t_document, t_pledge, t_client, t_person Так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2019, 15:24
Помогаю со студенческими работами здесь

Автоматическое обновление DataGridView после удаления записи
Здравствуйте Подскажите решение задачи. На форме dgv и 2 button (одна подгружает данные в DGV, вторая удаляет из базы выделенную...

Переиндексация строк таблицы после удаления записи
Привет. форумчане! Мне необходимо, когда из БД данные выстраиваются в столбик, в каждой строчке была нумерация. Причем в каждой...

После удаления записи сбивается номер по порядку
Всем привет! я использую номер по порядку DR_ID - который генерируется сам через триггер. Не знаю конечно на сколько это правильно. ...

Возвращение на предыдущую страницу после удаления записи из БД
Доброго дня уважаемые коллеги. Столкнулся с проблемой и очень нужна ваша помощь. Нахожусь на файле index.php. Удаляю записи из бд,...

Обновление dataGrid сразу после добавления/удаления записи, а не после перезапуска приложения
Здравствуйте, написал в с# процедуры на добавление и удаления данных, при нажатии соответственных кнопок, всё работает, но проблема в том...


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

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

Новые блоги и статьи
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru