|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
Microsoft SQL Server Enterprise (64-bit) 12.0.5207.0 Прошу помощи в написание Триггера! Суть такова: Имеем таблицу [dbo].[tblProducts] с полями te1, te2, te3, te4 и StatusW. Нужно заставить срабатывать триггер только в случае изменения в поле StatusW, и если вообще такое возможно, то только в случае, если поле StatusW будет изменено на "в работе". Моя версия: CREATE TRIGGER [Products] ON [dbo].[tblProducts] AFTER UPDATE AS IF ( UPDATE ([StatusW])) BEGIN INSERT INTO ...... END Но это работает не правильно.. помогите разобраться, как заставить работать триггер только в случае изменения в поле [StatusW] = 'в работе'. При любом другом статусе триггер не должен срабатывать.. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 09:44 |
|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
stsg, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 09:57 |
|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
HandKot stsg, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
? да, использовать временную таблицу inserted, это конечно вариант.. но записей со статусом: i.[StatusW] = 'в работе' может оказаться несколько, а мне нужно, что бы была отмечена только та, в которой изменили статус с "новый" на "в работе".. Может как то ожно использовать сразу в выражении: IF ( UPDATE ([StatusW])) = 'в работе' ??? BEGIN ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 10:32 |
|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
Триггер на UPDATE сработает в случае UPDATE таблицы всегда, независимо от каких-то там полей. И это изменить нельзя. Функцию UPDATE() в триггере использовать абсолютно бессмысленно. Приведите пример реальных действий триггера - проще будет отвечать. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 10:37 |
|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
stsg временную таблицу inserted Это не временная таблица, это "псеводо"-таблица, содержащая все затронутые строки изменяемой таблицы после изменений, deleted - тоже, но до изменений. вам нужно связать эти таблицы по ключу, и наложить требуемые условия Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 10:37 |
|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
stsg HandKot stsg, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
? да, использовать временную таблицу inserted, это конечно вариант.. но записей со статусом: i.[StatusW] = 'в работе' может оказаться несколько, а мне нужно, что бы была отмечена только та, в которой изменили статус с "новый" на "в работе".. Может как то ожно использовать сразу в выражении: IF ( UPDATE ([StatusW])) = 'в работе' ??? BEGIN Код: sql 1. 2.
Здесь id - первичный ключ (у вас чего-то непонятно, что является первичным ключом). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 10:47 |
|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
msLex stsg временную таблицу inserted Это не временная таблица, это "псеводо"-таблица, содержащая все затронутые строки изменяемой таблицы после изменений, deleted - тоже, но до изменений. вам нужно связать эти таблицы по ключу, и наложить требуемые условия Код: sql 1. 2. 3. 4. 5. 6.
Точно, похоже вы правы.. я использовал только inserted без связки с deleted и по этому срабатывал триггер на все записи с StatusW = 'в работе'.. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 10:48 |
|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
Суть задачи такова: есть бд к которой подключены продажи с интернет магазина и с Озона.. так вот, нужно реализовать автоматическое списание (продажу) товара так как управляют продажами из разных мест (например с личного кабинета Озона или с программы на ПК или с сайта компани). Для этого есть единственное связующие звено - это бд. на ms sql. По этому откуда бы не меняли статус заказа, он автоматом меняется в БД.. Вариант с триггером пока подходит лучше всего. Задача триггера - при изменении статуса в заказе - автоматом создать расходную накладную и списать н.. кол-во заказанного товара для своевременной синхронизации со всеми базами.. Сейчас, вроде задачу решил с добавлением таблицы deleted, вот сам триггер: CREATE TRIGGER ProductsOzon ON [dbo].[tblProductsOzon] AFTER UPDATE AS IF ( UPDATE ([StatusW])) BEGIN SELECT * FROM inserted i inner join deleted d ON i.ID = d.ID where i.[StatusW] = 'awaiting_deliver' AND d.StatusW = 'awaiting_packaging'; INSERT INTO [qdfSales] (OperationType, DocumentNumber, DocumentDate, SaleAmount, ClientID, StoreID, UserName) SELECT 'Продажа с Ozona', (SELECT MAX(DocumentNumber) + 1 FROM qdfSales), GETDATE(), 0, 24, 1, 'auto' FROM inserted i inner join deleted d ON i.ID = d.ID where i.[StatusW] = 'awaiting_deliver' AND d.StatusW = 'awaiting_packaging'; INSERT INTO [qdfSalesProducts] (Ordinal, ProductID, ProductCode, Product, Quantity, SalePrice, SaleID) SELECT 1, (SELECT ID FROM tblMain WHERE ProductCode = i.productsoffer_id), i.productsoffer_id, i.productsname, i.productsquantity, i.productsprice, (SELECT MAX(ID) FROM qdfSales) FROM inserted i inner join deleted d ON i.ID = d.ID where i.[StatusW] = 'awaiting_deliver' AND d.StatusW = 'awaiting_packaging'; END ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 11:19 |
|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
stsg, мне кажется, что есть ошибка в логике (возможно Вы не всё написали) Код: sql 1. 2. 3.
т.е Вы вставите одинаковых записей в таблицу, сколько записей было изменено, бес всякой привязке к изменяемой записи ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 12:22 |
|
Триггер на изменение одного поля в таблице.
|
|||
---|---|---|---|
#18+
HandKot stsg, мне кажется, что есть ошибка в логике (возможно Вы не всё написали) Код: sql 1. 2. 3.
т.е Вы вставите одинаковых записей в таблицу, сколько записей было изменено, бес всякой привязке к изменяемой записи Проверил - все работает! и вроде все правильно! >>>(SELECT MAX(DocumentNumber) + 1 FROM qdfSales)<<< - этот запрос просто берет максимальную запись номера документа из таблицы продажи, добавляет 1 (тут просто не может быть несколько результатов).. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2021, 12:49 |
|
|
start [/forum/topic.php?fid=46&fpage=22&tid=1684611]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 142ms |
0 / 0 |