올바르게 작동하기 위해 TSQL 트리거를 가져 오는 데 문제가 있습니다. 난 디버거를 통해 그것을 실행했습니다 및 모든 SQL Server Management Studio에 따라 변수를 설정하지 않습니다. 가장 당연한 일은 트리거 자체가 올바르게 실행되고 실행될 때 오류가 없다는 것입니다 ('실행 성공'이라고 말함).TSQL 트리거가 변수를 저장하지 못하거나 제대로 실행되지 않음
USE TestDb
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'OfficeSalesQuotaUpdate' AND type = 'TR')
DROP TRIGGER OfficeSalesQuotaUpdate
GO
CREATE TRIGGER OfficeSalesQuotaUpdate
ON SalesReps
AFTER UPDATE, DELETE, INSERT
AS
DECLARE @sales_difference int, @quota_difference int
DECLARE @sales_original int, @quota_original int
DECLARE @sales_new int, @quota_new int
DECLARE @officeid int
DECLARE @salesrepid int
--UPDATE(Sales) returns true for INSERT and UPDATE.
--Not for DELETE though.
IF ((SELECT COUNT(*) FROM inserted) = 0)
SET @salesrepid = (SELECT SalesRep FROM deleted)
ELSE
SET @salesrepid = (SELECT SalesRep FROM inserted)
--If you address the @salesrepid variable, it does not work. Doesn't even
--print out the 'this should work line.
PRINT 'This should work...' --+ convert(char(30), @salesrepid)
IF (@salesrepid = NULL)
PRINT 'SalesRepId is null'
ELSE
PRINT 'SalesRepId is not null'
PRINT convert(char(50), @salesrepid)
SET @officeid = (SELECT RepOffice
FROM SalesReps
WHERE SalesRep = @salesrepid)
SELECT @sales_original = (SELECT Sales FROM deleted)
SELECT @sales_new = (SELECT Sales FROM inserted)
--Sales can not be null, so we'll remove this later.
--Use this as a template for quota though, since that can be null.
IF (@sales_new = null)
BEGIN
SET @sales_new = 0
END
IF (@sales_original = 0)
BEGIN
SET @sales_original = 0
END
SET @sales_difference = @sales_new - @sales_original
UPDATE Offices
SET Sales = Sales + @sales_difference
WHERE Offices.Office = @officeid
GO
을 그래서, 어떤 조언 : (그냥 익숙한 내 자신을 점점 .... 진행중인 작품이다)은 다음과 같이
코드는 무엇입니까? 나는 이걸 완전히 뒤엎았다. 미리 감사드립니다.
다른 무엇이든 잘못 여기 수 있습니다 (원본이 아니라 상정하지, 중 올바른 얻을) 다중 행 조작에 잘 대처하기 위해 쓰여졌습니다 - 삽입 및 삭제 된 의사 테이블은 여러 행을 포함 할 수 있습니다. –
괜찮습니다. 단지 수업 시간입니다. 그러나 다른 한편으로, 둘 이상의 행이있을 때 가상 '삽입 된'테이블과 '업데이트 된'테이블 각각에서 두 행을 갖는 방법을 어떻게 알 수 있습니까? – Nitrodist