1. Trang chủ
  2. » Công Nghệ Thông Tin

Code SQL Server Trigger

4 517 4

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 4
Dung lượng 14,14 KB

Nội dung

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 1

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] 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 2

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

Trang 3

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

Trang 4

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

Ngày đăng: 06/12/2016, 11:47

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w