繁体   English   中英

SQL Server 2008 R2销售交易触发器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM