[英]SQL Server 2008 R2 Sales transaction Trigger
我要交作业,所以任何帮助都会非常感谢!
不知道我是否做对了,非常感谢您的帮助!
创建触发器,以使任何初始输入或修改的交易都不能超过信用额度。 如果销售交易超过信用额度,请回滚该交易。
我的密码
Create Trigger salesTransaction on Customers
For insert, update
as
--Get Credit limit
Declare @@Creditlimit money
select @@Creditlimit = CreditLimt from inserted i
Declare @@amount money
select @@amount = (p.Price * s.qtyOrdered) from inserted i
inner join Orders o
on i.CustomerNo = o.CustomerNo
inner join SalesDetail s
on s.OrderNo = o.OrderNo
inner join Products p
on (p.ManufactureID + p.ProductID) = (s.ManufactureID + s.ProductID)
where (i.CustomerNo = o.CustomerNo and o.CustomerNo = s.OrderNo and s.ManufactureID = p.ManufactureID and s.ProductID = p.ProductID)
if(@@amount > @@Creditlimit)
Begin
rollback transaction
End
我的桌子
Create Table Customers
(
CustomerNo char(4)
Constraint ck_CustomerNoHas4positionsWithNumbers
Check(CustomerNo like'[0-9],[0-9],[0-9],[0-9]'),
Company varchar(50) not null,
CustomerRep char(3),
CreditLimt money default(20000.00),
PRIMARY KEY(CustomerNo)
)
Alter Table Customers
Add constraint fk_customerrep
FOREIGN KEY (CustomerRep)
REFERENCES Salesreps(EmployeeNo)
Create Table Orders
(
OrderNo int,
OrderDate Date not null,
CustomerNo char(4) not null,
SalesRep char(3) not null
PRIMARY KEY(OrderNo)
)
Alter Table Orders
Add constraint fk_customerno
FOREIGN KEY (CustomerNo)
REFERENCES Customers(CustomerNo),
constraint fk_salesrep
FOREIGN KEY (SalesRep)
REFERENCES Salesreps(EmployeeNo)
Create Table SalesDetail
(
SaleDetailID int,
ManufactureID char(3) Constraint ck_ManufactureIDFromSaleDetails check(ManufactureID like'[a-z],[a-z],[a-z]') not null,
ProductID char(5) Constraint ck_ProductIDSalesDetail check(ProductID like'[0-9],[0-9],[a-z],[a-z],[a-z]') not null,
OrderNo int,
qtyOrdered int
PRIMARY KEY(SaleDetailID)
)
Alter Table SalesDetail
add FOREIGN KEY (OrderNo)
REFERENCES Orders(OrderNo)
Alter Table SalesDetail
Add constraint fk_SalesDetails_Mid_Pid
FOREIGN KEY (ManufactureID, ProductID)
REFERENCES Products(ManufactureID, ProductID)
Create Table Products
(
ManufactureID char(3)
Constraint ck_ManufactureIDifItHasLettersOnly check(ManufactureID like'[a-z],[a-z],[a-z]'),
ProductID char(5)
Constraint ck_ProductIDhasTwoLettersAndThreeNumbers check(ProductID like'[a-z],[a-z],[0-9],[0-9],[0-9]'),
Description varchar(50) not null,
Price money not null,
QtyOnHand int not null,
PRIMARY KEY(ManufactureID, ProductID)
)
几件事:
为什么是触发Customer
?? 您不想在插入(或更新)新客户时检查这些条件-而是在插入新订单时检查-不?
您的代码没有考虑到以下事实:触发器将每个语句调用一次,并且该语句可以很好地一次插入(或更新) 多个订单 -因此, Inserted
伪表可以 (并且将包含!)包含多个条目,并且您的代码不适用于多个条目...。
所以我的看法是:
Orders
表上 Inserted
多行 CreditLimit
-如果该数大于零(至少一个订单超过该限制),我将回滚该交易。 这是触发代码:
CREATE TRIGGER salesTransaction ON dbo.Orders
FOR INSERT, UPDATE
AS
--Get Credit limit
DECLARE @Count INT
SELECT @COUNT = COUNT(*)
FROM Inserted i
INNER JOIN dbo.Orders o ON i.CustomerNo = o.CustomerNo
INNER JOIN SalesDetail s ON s.OrderNo = o.OrderNo
INNER JOIN Products p ON p.ManufactureID = s.ManufactureID AND m.Product = s.ProductID
INNER JOIN dbo.Customer c ON o.CustomerNo = c.CustomerNo
WHERE (p.Price * s.qtyOrdered) > c.CreditLimit
IF (@Count > 0)
ROLLBACK TRANSACTION
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.