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

Триггер insert delete

08.12.2013, 22:56. Показов 2515. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите допилить триггер, начал только изучать sql, как сделать что бы он сработал еще на удаление! при удалении срабатывает на первом условии! есть подозрения что дело в синтаксесе
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
35
36
37
38
39
CREATE TRIGGER PRODUCT_BB
ON product_in_bill 
FOR INSERT, DELETE
AS
DECLARE @x INT, @y INT
IF @@ROWCOUNT=1
BEGIN
  IF NOT EXISTS(
    SELECT *
      FROM inserted ins
        WHERE ins.number_product<=(
            SELECT
                prd.number_product_on_stock
                    FROM product prd
                        WHERE (ins.article_product=prd.article_product) 
                             )
                        )
   BEGIN
      ROLLBACK TRAN
         PRINT 'ТОВАРА НА СКЛАДЕ МЕНЬШЕ, ЧЕМ УКАЗАНО В НАКЛАДНОЙ'
END
        ELSE
   BEGIN
       SELECT @y=ins.article_product, @x=ins.number_product
           FROM product_in_bill  p, inserted ins
               WHERE p.article_product=ins.article_product
                   UPDATE product
                        SET number_product_on_stock=number_product_on_stock-@x
                            WHERE article_product=@y
                      
END
  END
     BEGIN
       SELECT @y=article_product, @x=number_product
           FROM deleted
              UPDATE product
                SET number_product_on_stock=number_product_on_stock+@x
                      WHERE article_product=@y
END
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2013, 22:56
Ответы с готовыми решениями:

Триггер DELETE
Здравствуйте! Задача звучит следующим образом (работаю с AdventureWorks): Имеется таблица JobCandidate и JobCandidateHistory. Необходимо...

Триггер AFTER DELETE
IF OBJECT_ID ('deleteClient') IS NOT NULL ...

Триггер DELETE
Пытаюсь создать триггер на событие DELETE в таблице Titleauthor, который удаляет соответствующие записи в таблицах Authors и Titles. ...

2
20 / 20 / 1
Регистрация: 03.01.2013
Сообщений: 184
12.12.2013, 11:26
Цитата Сообщение от appledroid Посмотреть сообщение
NOT EXISTS(
* * SELECT *
* * * FROM inserted ins
* * * * WHERE ins.number_product<=(
* * * * * * SELECT
* * * * * * * * prd.number_product_on_stock
* * * * * * * * * * FROM product prd
* * * * * * * * * * * * WHERE (ins.article_product=prd.article_product )
* * * * * * * * * * * * * * *)
* * * * * * * * * * * * )
Есть подозрение что всегда выполняется. Видимо в дело в NOT EXISTS
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
12.12.2013, 13:00
Кликните здесь для просмотра всего текста
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- if object_id('product') is not null drop table product
IF OBJECT_ID('product') IS NULL
BEGIN
    CREATE TABLE product (
       article_product INT IDENTITY CONSTRAINT PK_Product PRIMARY KEY, 
       name VARCHAR(100), 
       number_product_on_stock INT)
END
 
-- if object_id('product_in_bill') is not null drop table product_in_bill
IF OBJECT_ID('product_in_bill') IS NULL
BEGIN
    CREATE TABLE product_in_bill (
        id INT IDENTITY CONSTRAINT PK_ProductInBill PRIMARY KEY, 
        article_product INT CONSTRAINT FK_ProductInBill_Product REFERENCES product(article_product), 
        number_product INT
        )
END
GO
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
IF OBJECT_ID('TR_ProductInBill_AIU') IS NOT NULL DROP TRIGGER TR_ProductInBill_AIU
GO
CREATE TRIGGER TR_ProductInBill_AIU ON product_in_bill
AFTER INSERT,UPDATE
AS
IF EXISTS (
        SELECT * -- Да-да, с учетом группировки! EXISTS вообще не смотрит на список вывода :)
        FROM inserted i 
        JOIN product p on p.article_product=i.article_product
        LEFT JOIN deleted d ON d.article_product = i.article_product
        group by p.article_product, p.number_product_on_stock
        having p.number_product_on_stock < sum(i.number_product - ISNULL(d.number_product, 0))
        )
BEGIN
    ROLLBACK TRAN
    -- PRINT 'ТОВАРА НА СКЛАДЕ МЕНЬШЕ, ЧЕМ УКАЗАНО В НАКЛАДНОЙ'
    RAISERROR ('ТОВАРА НА СКЛАДЕ МЕНЬШЕ, ЧЕМ УКАЗАНО В НАКЛАДНОЙ',16,1)
END
ELSE
BEGIN
    UPDATE p
    SET p.number_product_on_stock -= i.number_product
    FROM product p
    join(
       select i.article_product, SUM(i.number_product-ISNULL(d.number_product,0)) AS number_product 
       from inserted i
       LEFT JOIN deleted d ON d.article_product = i.article_product
       group by i.article_product
       ) i on i.article_product=p.article_product
END
GO
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
IF OBJECT_ID('TR_ProductInBill_AD') IS NOT NULL DROP TRIGGER TR_ProductInBill_AD
GO
CREATE TRIGGER TR_ProductInBill_AD ON product_in_bill
AFTER DELETE
AS
    UPDATE p
    SET p.number_product_on_stock += d.number_product
    FROM product p 
    JOIN (
       select d.article_product, SUM(d.number_product) AS number_product
       from deleted d
       group by d.article_product
       ) d on d.article_product=p.article_product
GO

1
T-SQL
1
2
3
4
insert product(NAME, number_product_on_stock)values
   ('prod01',100),('prod02',10);
select * from product 
select * from product_in_bill
article_productnamenumber_product_on_stock
1prod01100
2prod0210

id article_productnumber_product

2
T-SQL
1
2
3
insert product_in_bill(article_product,number_product) values (1,50),(2,8),(1,60)
select * from product 
select * from product_in_bill
Сообщение 50000, уровень 16, состояние 1, процедура TR_ProductInBill_AIU, строка 15
ТОВАРА НА СКЛАДЕ МЕНЬШЕ, ЧЕМ УКАЗАНО В НАКЛАДНОЙ
Сообщение 3609, уровень 16, состояние 1, строка 1
The transaction ended in the trigger. The batch has been aborted.
3
T-SQL
1
2
3
insert product_in_bill(article_product,number_product) values (1,50),(2,8),(1,40)
select * from product 
select * from product_in_bill
article_productnamenumber_product_on_stock
1prod0110
2prod022

idarticle_productnumber_product
4150
528
6140

4
T-SQL
1
2
3
delete product_in_bill where id=4
select * from product 
select * from product_in_bill
article_productnamenumber_product_on_stock
1prod0160
2prod022

idarticle_productnumber_product
528
6140
5
T-SQL
1
2
3
update product_in_bill set number_product=60 where id=6
select * from product 
select * from product_in_bill
article_productnamenumber_product_on_stock
1prod0140
2prod022

idarticle_productnumber_product
528
6160
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2013, 13:00
Помогаю со студенческими работами здесь

Instead of delete триггер
Есть таблица Hardware с первичным ключом IDHardware и таблица Orders с внешними ключами IDHardware1, IDHardware2, IDHardware3. Для таблицы...

Триггер after delete
Привет. Написал триггер after delete. Он будет работать, только если мы удаляем построчно или при массовом удалении тоже будет...

Триггер DELETE
Здравствуйте, Задача звучит следующим образом Имеется таблица RKniga и RArhiv. Необходимо создать триггер AvtoPerenos, который должен...

Не работает триггер after delete
/*Удаляю все пациентов, которые не оплатили лечение */ create trigger client_money_delete1 on Прием after delete as if (exists...

Триггер delete, фиксирование каждой записи
Написал триггер, который записывает все удаления в таблице в отдельную таблицу. create trigger . on . after delete as begin ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru