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 ) printkhong the xoa; else begin delete(OrderID=sod.SalesOrderID) end printKhong xoa duoc; rollback transaction; end
Trang 1Cau: 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] Script Date: 10/14/2016 15:42:35 ******/
SET ANSI_NULLS ON
GO
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;
Trang 2SET 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
Trang 3WHERE 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
Trang 4AFTER 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