Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 4 - Использование Триггеров.doc
Скачиваний:
4
Добавлен:
30.08.2019
Размер:
97.28 Кб
Скачать

Упражнение 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