Упражнение 3.
Триггеры в комбинации с применением флажков условий. Триггер ставит флаг в строке таблицы, где имеется дополнительная информация об объекте в другой таблице.
ALTER TABLE Production.Product
ADD InformationFlag BIT NOT NULL
CONSTRAINT InformationFlagDefault DEFAULT 0 WITH VALUES
------------------------------------------------------------------------
UPDATE p
SET p.InformationFlag=1
FROM Production.Product p WHERE EXISTS
(
SELECT 1
FROM Production.ProductDocument pd
WHERE pd.ProductID = p.ProductID
)
------------------------------------------------------------------------
CREATE TRIGGER DocumentBelongsToProduct
ON Production.ProductDocument
FOR INSERT, DELETE
AS
DECLARE @Count int
SELECT @Count = COUNT(*) FROM Inserted IF @Count > 0
BEGIN
UPDATE p
SET p.InformationFlag = 1
FROM Inserted i
JOIN Production.Product p
ON i.ProductID = p.ProductID
END
IF @@ERROR != 0
ROLLBACK TRAN
SELECT @Count = COUNT(*) FROM Deleted
IF @Count > 0
BEGIN
UPDATE p
SET p.InformationFlag = 0
FROM Inserted i
RIGHT JOIN Production.Product p
ON i.ProductID = p.ProductID
WHERE i.ProductID IS NULL
END
IF @@ERROR != 0 ROLLBACK TRAN
----------------------------------------------------------------------
SELECT ProductID, InformationFlag
FROM Production.Product p
WHERE p.ProductID=1
Результат:
ProductId |
InformaionFlag |
1 |
0 |
INSERT INTO Production.ProductDocument
(ProductID, DocumentID)
VALUES (1, 1)
SELECT ProductID, InformationFlag
FROM Production.Product p
WHERE p.ProductID = 1
Результат:
ProductId |
InformaionFlag |
1 |
1 |
DELETE Production.ProductDocument
WHERE ProductID = 1 AND DocumentID = 1
SELECT ProductID,InformationFlag
FROM Production.Product p
WHERE p.ProductID = 1
Результат:
ProductId |
InformaionFlag |
1 |
0 |
Упражнение 4.
Применение триггеров для проверки дельты обновления.
CREATE TABLE Production.InventoryAudit (
TransactionID INT IDENTITY PRIMARY KEY,
ProductId INT NOT NULL
REFERENCES Production.Product (ProductID),
NetAdjustment SMALLINT NOT NULL,
ModifiedDate DATETIME DEFAULT(CURRENT_TIMESTAMP) )
GO
----------------------------------------------------------------
CREATE TRIGGER ProductAudit
ON Production.ProductInventory
FOR INSERT, UPDATE, DELETE
AS
INSERT INTO Production.InventoryAudit (ProductID,NetAdjustment)
SELECT COALESCE(i.ProductID, d.ProductID),
ISNULL(i.Quantity, 0) - ISNULL(d.Quantity, 0) AS NetAdjustment
FROM Inserted i
FULL JOIN Deleted d
ON i.ProductID = d.ProductId
AND i.LocationID=d.LocationID
WHERE ISNULL(i.Quantity,0) - ISNULL(d.Quantity, 0)!= 0
----------------------------------------------------------------
UPDATE Production.ProductInventory
SET Quantity = Quantity + 7
WHERE ProductID= 1 AND LocationID= 50
PRINT 'The values before the change are:'
SELECT ProductID, LocationID, Quantity
FROM Production.ProductInventory
WHERE ProductID= 1 AND LocationID=50
PRINT 'Now making the change'
UPDATE Production.ProductInventory
SET Quantity = Quantity - 7
WHERE ProductID=1 AND LocationID=50
PRINT 'The values after the change are:'
SELECT ProductID,LocationID,Quantity
FROM Production.ProductInventory
WHERE ProductID = 1 AND LocationID = 50
PRINT 'History of your inventory actions:'
SELECT * FROM Production.InventoryAudit
Результат:
The values before the change are:
ProductId |
LocationId |
Quantity |
1 |
50 |
360 |
Now making the change
The values after the change are:
ProductId |
LocationId |
Quantity |
1 |
50 |
353 |
History of your inventory actions:
TransactionId |
ProductId |
NewAdjustment |
ModifiedDate |
1 |
1 |
7 |
2012-03-30 10:49:35.517 |
2 |
1 |
-7 |
2012-03-30 10:49:35.537 |