2012-03-28 4 views
0

주문한 수량에 따라 재고 수량을 확인하는 업데이트 트리거를 만들려고합니다. 해당 제품이 충분하지 않은 경우 메시지가 저장됩니다.특정 삽입 값이있는 행을 검색 한 다음 해당 행의 값을 삽입 값과 비교합니다.

나를 트리거를 생성시키는 것하지만 테스트 할 때, 그것은 오류를 표시

나 ' "하위 쿼리. 이것은 서브 쿼리는 =,! =, ... 다음에 올 때 허용되지 않는 1 개 이상의 값을 반환" 먼저 삽입 된 값과 일치하는 제품 ID로 특정 행을 검색 할 때 하나 이상의 값을 반환하는 방법을 실제로 이해하지 못합니다. 그런 다음 UnitsInStock과 삽입 된 값을 비교합니다.

는 여기에 지금까지이 작업은 다음과 같습니다

CREATE TRIGGER tr_check_qty 
ON OrderDetails 
FOR UPDATE 
AS 
DECLARE @ProductID int, 
    @Quantity int 

SELECT @ProductID = ProductID, 
    @Quantity = Quantity 
FROM inserted 
WHERE @ProductID = (SELECT ProductID FROM Products) 

IF 
@Quantity > (SELECT UnitsInStock FROM Products) 
BEGIN 
    PRINT 'Not enough product in stock' 
    ROLLBACK TRANSACTION 
END 
+3

당신의 방아쇠는 깨졌습니다. - 당신은'inserted'은 한 줄만 포함한다고 가정하고 있습니다. 이것은 일반적으로 정확한 가정이 아닙니다. (트리거는 * 문의 *마다 한번씩 * 행당 한번 실행되지 않습니다) –

답변

0

SELECT UnitsInStock FROM Products뿐만 아니라 SELECT ProductID FROM Products 은 전체 열이 아닌 단일 값을 반환 할 수 있습니다. 일부 제한은 WHERE id = @someId과 같이 지정해야합니다.

+0

고마워요! 그랬어! – Serenity

0

더 많은 제품이 있습니까?

그런 다음이 라인 :

WHERE @ProductID = (SELECT ProductID FROM Products) 

그리고이 라인 :

@Quantity > (SELECT UnitsInStock FROM Products) 

가 많은 행을 반환합니다.

두 개 이상의 행을 삽입하는 경우에도 마찬가지입니다. inserted 테이블뿐만 아니라

당신은 할 수 있습니다 두 개 이상의 행이됩니다 같은 것을 할 필요가 : 당신이 뭔가 원하는

IF EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      inserted 
     WHERE EXISTS 
      (
       SELECT 
        NULL 
       FROM 
        Product 
       WHERE 
        Product.Quantity>inserted.Quantity 
      ) 
    ) 
BEGIN 
    PRINT 'Not enough product in stock' 
    ROLLBACK TRANSACTION 
END 
1

내가 생각 을 그러나

CREATE TRIGGER tr_check_qty 
ON OrderDetails 
FOR UPDATE 
AS 
IF EXISTS (
    SELECT * 
    FROM 
     Products p 
      inner join 
     inserted i 
      on p.ProductID = i.ProductID 
    WHERE i.Quantity > p.UnitsInStock) 
BEGIN 
    PRINT 'Not enough product in stock' 
    ROLLBACK TRANSACTION 
END 

을, 나는 이것이 트리거 트리거 트리거와 비교하여 왜 트리거 내부에 있는지에 대해 약간의 신비를 느낀다.

+0

어리석은 추측 : 이는 업데이트 *의 트리거 *입니다. 즉, 충분한 제품이 재고가 없다는 정보로 업데이트해야합니다. :) 진지하게, 나는 그것이 업데이트와 삽입을 위해 둘 다 있어야한다고 생각한다. –

+0

주문이 이미 존재하기 때문에 업데이트입니다 ... 제품을 변경하려는 것입니다. 하지만 고마워. 그게 도움이 됐어. – Serenity

+0

아, 좋은 지적이야. 아마 둘 다 있어야 할 것 같아. 감사! – Serenity

관련 문제