Триггер транзакции продаж SQL Server 2008 R2 - PullRequest
1 голос
/ 28 ноября 2011

У меня назначено задание, поэтому любая помощь очень поможет, спасибо!

Не уверен, что если я все сделал правильно, любая помощь будет большой благодарностью!

Создайте триггер, чтобы нельзя было изначально вводить или изменять транзакцию продажи, которая превышает кредитный лимит. Если транзакция продажи превышает кредитный лимит, откат транзакции.

Мой код

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)
)

1 Ответ

1 голос
/ 28 ноября 2011

Несколько вещей:

  • ПОЧЕМУ является триггер на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...