--Cau: Viết trigger cho thao tác delete trên bảng Sales.SalesOrderHeader
khi có thao tác xóa trên
--bảng này thì kiểm tra sản phẩm đó có tồn tại trên
Sales.SalesOrderDetail không. Nếu tồn tại thì
-- thông báo không thể xóa, ngược lại thì xóa sản phẩm đó.
create trigger check_delete
on Sales.SalesOrderHeader
for delete
as
declare @OrderID int
begin
if exists (
SELECT
sod.SalesOrderID, soh.SalesOrderID AS Expr1
FROM
Sales.SalesOrderDetail sod JOIN
Sales.SalesOrderHeader soh ON
sod.SalesOrderID = soh.SalesOrderID
where sod.SalesOrderID = soh.SalesOrderID
)
print'khong the xoa';
else
begin
delete(@OrderID=sod.SalesOrderID)
end
print'Khong xoa duoc';
rollback transaction;
end
------USE [AdventureWorks2008R2]
GO
/****** Object: Trigger [Sales].[uSalesOrderHeader]
10/14/2016 15:42:35 ******/
SET ANSI_NULLS ON
GO
Script Date:
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [Sales].[uSalesOrderHeader] ON [Sales].[SalesOrderHeader]
AFTER UPDATE NOT FOR REPLICATION AS
BEGIN
DECLARE @Count int;
SET @Count = @@ROWCOUNT;
IF @Count = 0
RETURN;
SET NOCOUNT ON;
BEGIN TRY
-- Update RevisionNumber for modification of any field EXCEPT the
Status.
IF NOT UPDATE([Status])
BEGIN
UPDATE [Sales].[SalesOrderHeader]
SET [Sales].[SalesOrderHeader].[RevisionNumber] =
[Sales].[SalesOrderHeader].[RevisionNumber] + 1
WHERE [Sales].[SalesOrderHeader].[SalesOrderID] IN
(SELECT inserted.[SalesOrderID] FROM inserted);
END;
-- Update the SalesPerson SalesYTD when SubTotal is updated
IF UPDATE([SubTotal])
BEGIN
DECLARE @StartDate datetime,
@EndDate datetime
SET @StartDate = [dbo].[ufnGetAccountingStartDate]();
SET @EndDate = [dbo].[ufnGetAccountingEndDate]();
UPDATE [Sales].[SalesPerson]
SET [Sales].[SalesPerson].[SalesYTD] =
(SELECT SUM([Sales].[SalesOrderHeader].[SubTotal])
FROM [Sales].[SalesOrderHeader]
WHERE [Sales].[SalesPerson].[BusinessEntityID] = [Sales].
[SalesOrderHeader].[SalesPersonID]
AND ([Sales].[SalesOrderHeader].[Status] = 5) -Shipped
AND [Sales].[SalesOrderHeader].[OrderDate] BETWEEN
@StartDate AND @EndDate)
WHERE [Sales].[SalesPerson].[BusinessEntityID]
IN (SELECT DISTINCT inserted.[SalesPersonID] FROM
inserted
WHERE inserted.[OrderDate] BETWEEN @StartDate AND
@EndDate);
-- Update the SalesTerritory SalesYTD when SubTotal is
updated
UPDATE [Sales].[SalesTerritory]
SET [Sales].[SalesTerritory].[SalesYTD] =
(SELECT SUM([Sales].[SalesOrderHeader].[SubTotal])
FROM [Sales].[SalesOrderHeader]
WHERE [Sales].[SalesTerritory].[TerritoryID] = [Sales].
[SalesOrderHeader].[TerritoryID]
AND ([Sales].[SalesOrderHeader].[Status] = 5) -Shipped
AND [Sales].[SalesOrderHeader].[OrderDate] BETWEEN
@StartDate AND @EndDate)
WHERE [Sales].[SalesTerritory].[TerritoryID]
IN (SELECT DISTINCT inserted.[TerritoryID] FROM inserted
WHERE inserted.[OrderDate] BETWEEN @StartDate AND
@EndDate);
END;
END TRY
BEGIN CATCH
EXECUTE [dbo].[uspPrintError];
-- Rollback any active or uncommittable transactions before
-- inserting information in the ErrorLog
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
END
EXECUTE [dbo].[uspLogError];
END CATCH;
END;
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'AFTER
UPDATE trigger that updates the RevisionNumber and ModifiedDate columns
in the SalesOrderHeader table.Updates the SalesYTD column in the
SalesPerson and SalesTerritory tables.' ,
@level0type=N'SCHEMA',@level0name=N'Sales',
@level1type=N'TABLE',@level1name=N'SalesOrderHeader',
@level2type=N'TRIGGER',@level2name=N'uSalesOrderHeader'
GO
--1. --sua ten --> khong cho --> trigger kiem soat viec UPDATE(LastName)
ten
create trigger CheckTen
on Person.Person
for update
as
begin
if UPDATE (LastName)
RAISERROR('Khong duoc sua ten',16,1)
ROLLBACK TRANSACTION
end
--2. Header/ OrderDetail
--Viết trigger trgInsertOrderDetail để đáp ứng yêu cầu nghiệp vụ sau “khi
--một PurchaseOrder cùng lúc phát sinh nhiều hà
g trong bảng chi tiết
--purchaseorder thì tổng số tiền từ các hà
ng mớ
i nàphải được cộng dồn
--vàtrường SubTotal của chính purchaseorder đó trong bảng
--purchaseorderheader”
--tao trigger cho thao tac INSERT tren PurchaseOrderDEtail
--update lai Subtotal tren Purchasing.PurchaseOrderHeader
CREATE TRIGGER ABC
ON Purchasing.PurchaseOrderDetail
AFTER INSERT
AS
BEGIN
IF EXISTS(SELECT PurchaseOrderID FROM inserted
WHERE PurchaseOrderID IN(SELECT PurchaseOrderID FROM
Purchasing.PurchaseOrderHeader))
BEGIN
UPDATE Purchasing.PurchaseOrderHeader
SET SubTotal = SubTotal + (Select
sum(unitprice*OrderQty) from inserted)
where PurchaseOrderID in (select PurchaseOrderID from
inserted)
END
END
--3 Tạo trigger kiểm tra khi nhập thêm nhân viên mớ
i và
O phòng Production
--có là
m vượt quá số nhân viên quy định của phòng la 280, nếu có thì hủy
--bỏ việc nhập mớ
i nà
y
create trigger ChekNV
on
SELECT * FROM HumanResources.Employee
SELECT * FROM HumanResources.Department