2012-12-16 5 views
3

이것은 아마도 어리석은 질문이지만 내 꼬리를 쫓고 있습니다. 주문 수량은 다음 재고 수량을 초과 할 경우SQL : 2 개의 테이블을 참조하는 트리거

주문 테이블과 제품 테이블은 ...

아마, 3 권의 책을 확인이 작업을 수행 할 수있는 방법을 찾을 수 없습니다, 50 개 핵심 단어를 검색 좀했습니다. 이것은 내가 시도한 것이지 내가 시도한 것의 전제입니다.

CREATE TRIGGER tr_check_qty 
ON order_details 
FOR INSERT,UPDATE 
AS 
IF (SELECT quantity FROM inserted) > products.quantity_in_stock 
    BEGIN 
     PRINT 'Orderded quantity cannot exceed quantity in stock' 
     ROLLBACK TRANSACTION 
    END 

어디에서 가입 할 수 있습니까? 나는 20 가지 다른 방법을 시도했다. 앞에 변수를 선언하려고 시도했다. 나는 이것을 할 수있는 방법을 찾을 수 없다.

건배.

+0

MSDN에는 정확히 필요한 것이 있습니다. 예제 C를 참조하십시오. http://msdn.microsoft.com/en-us/library/aa258254(v=sql.80).aspx –

+0

트리거 대신 쉬운 저장 프로 시저를 고려하십시오. 저장 프로 시저를 사용하여 주문 행을 업데이트하는 경우 먼저 충분한 재고가 있는지 확인하기 위해 수정할 수 있습니다. – Andomar

+1

동시에 여러 테이블에 하나 이상의 레코드를 삽입 할 수 있으므로 다른 제품에 영향을 미칠 수도 있습니다. 귀하의 방아쇠 접근 방식은 그 가능성을 반영하지 않지만 반드시 그러해야합니다. '삽입 된'또는 '삭제 된'및 *가 설정된 작업이 아닌 모든 트리거는 치명적인 결함이 있습니다. 트리거를 디자인하기 전에 누군가가 20 개의 레코드를 삽입 할 때 어떤 일이 일어나야하는지 정의해야합니다. 그 중 일부는 괜찮으며 일부는 그렇지 않습니다. (단일 레코드 삽입 만 허용하려면 저장 프로 시저를 사용할 수 있습니다.) – Tomalak

답변

3

당신은이 작업을 수행 할 수 있습니다 :

그것은 단일 행 삽입과 다중 행 삽입 모두 작동
CREATE TRIGGER tr_check_qty ON order_details 
FOR INSERT,UPDATE 
AS 
BEGIN 
    -- rollback transaction if any product type in order exceeds stock amount 
    IF EXISTS (
    SELECT 
     * 
    FROM 
     inserted 
     INNER JOIN products ON inserted.product_id = products.product_id 
    GROUP BY 
     products.product_id 
    HAVING 
     SUM(inserted.quantity) > MAX(products.quantity_in_stock) 
) 
    BEGIN 
    PRINT 'Ordered quantity cannot exceed quantity in stock' 
    ROLLBACK TRANSACTION 
    END 
END 

.

+0

products.quantity_in_Stock에 MIN(), MAX() 또는 AVG()를 사용해야합니다. 그렇지 않으면 quantity_in_stock을 여러 번 계산합니다. – StrayCatDBA

+0

@StrayCatDBA 맞습니다. 결정된. (힌트를 주셔서 감사합니다!) – Tomalak

관련 문제