Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Trigger update/delete/insert mssql  [new]
Kotovach
Member

Откуда:
Сообщений: 24
Create a new table Production.ProductsHistory that will be used to store the history of changes in Production.Products. The history table should include the following columns: ID (primary key, identity); Action (varchar, will contain an action type Insert, Update or Delete); ModifiedDate (datetime); productid (the productid value from original Production.Products table); UserName (the name of user who applied changes). Create other columns if you think they are reasonable.
Create a trigger for the INSERT, UPDATE and DELETE operations for the Production.Products table to save history of changes to the Production.ProductsHistory table.
Try to insert, update or delete rows in the Production.Products. Verify the Production.ProductsHistory was populated. Try to affect several records in one operation (for example update 5 records in one UPDATE statement and verify all 5 records were added to the history).

CREATE TABLE TestSQL.Production.ProductsHistory
(
    Id INT IDENTITY PRIMARY KEY,
    ProductId INT NOT NULL,
    [Action]  VARCHAR(6) NOT NULL,
    ModifiedDate DATETIME NOT NULL DEFAULT GETDATE(),
	UserName NCHAR(60) NOT NULL DEFAULT SYSTEM_USER
);


CREATE TRIGGER trg_Products_IUD
ON TestSQL.Production.Products
AFTER INSERT, UPDATE, DELETE
AS BEGIN

DECLARE  @ProductId INT

---- Get data from inserted/ updated
		   SELECT @ProductId=ProductId        
           FROM inserted

 ---- Get data from deleted
              SELECT @ProductId=ProductId
              FROM deleted

  -- Insert Case
   IF EXISTS( SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted) 
    BEGIN
             INSERT INTO TestSQL.Production.ProductsHistory (ProductId, [Action])
              Values( @ProductId, 'Insert')
    END
    
    -- Update Case
   IF EXISTS( SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
    BEGIN
             INSERT INTO TestSQL.Production.ProductsHistory (ProductId, [Action])
              Values( @ProductId, 'Update')
    END
      
       -- Delete Case
       IF EXISTS( SELECT * FROM deleted) AND NOT EXISTS (SELECT * FROM inserted)
       BEGIN
            
         INSERT INTO TestSQL.Production.ProductsHistory (ProductId, [Action])
              Values( @ProductId, 'Delete')

       END
END



Мой триггер пишет только первую изменяемую/удаляемую/вставляемую строку если это группа строк

INSERT INTO TestSQL.Production.Products (productname, supplierid, categoryid, unitprice, discontinued)
Values('Product AAAAA', 1, 5, 13.0000, 1),
('Product AAAAA', 1, 5, 15.0000, 1),
('Product AAAAA', 1, 5, 14.0000, 1),
('Product AAAAA', 1, 5, 16.0000, 1)


с одиночными работает отлично


подкажите, пожалуйста, как в history писать все изменения?
7 фев 19, 16:34    [21803684]     Ответить | Цитировать Сообщить модератору
 Re: Trigger update/delete/insert mssql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36096
             INSERT INTO TestSQL.Production.ProductsHistory (ProductId, [Action])
              select ProductId, 'Insert' from inserted


Далее самостоятельно.
7 фев 19, 16:35    [21803687]     Ответить | Цитировать Сообщить модератору
 Re: Trigger update/delete/insert mssql  [new]
Kotovach
Member

Откуда:
Сообщений: 24
Гавриленко Сергей Алексеевич,

тоооочно)))
Спасибо! низкий поклон! =)
7 фев 19, 16:47    [21803695]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить