이 트리거가 있습니다 :트랜잭션이 트리거로 종료되었습니다. 일괄 처리가 중단되었습니다. 유도 된 속성
CREATE trigger [dbo].[DeriveTheAge] on [dbo].[Student]
after insert,update
as
begin
declare @sid as int;
declare @sdate as date;
select @sid= [Student ID] from inserted;
select @sdate=[Date of Birth] from inserted;
commit TRANSACTION
if(@sdate is not null)
begin
update Student set Age=DATEDIFF(YEAR,@sdate,GETDATE()) where [Student ID][email protected];
end
print 'Successfully Done'
end
제안에서 트리거는 자동으로 파생 된 특성 "나이"생년월일에서 계산합니다. 하지만 삽입 할 때이 오류가 발생합니다.
(1 row(s) affected)
Successfully Done
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
처음에는 행이 업데이트 된 오류를 가져 오므로이 오류가 발생하지 않았습니다. 하지만 이제 FORNT END 레코드를 삽입 할 때 레코드가 업데이트되지 않습니다. 대신이 예외가 throw됩니다.
누구든지 나를 도울 수 있습니까?
btw, SQL Server 2008 R2 및 Visual Studio 2010입니다.
수정 : 레코드가 계속 업데이트 중입니다. 그러나 예외는 빌란입니다.
업데이트
CREATE TRIGGER [dbo].[DeriveTheAge]
ON [dbo].[Student]
FOR INSERT, UPDATE
AS
BEGIN
UPDATE s
SET Age = DATEDIFF(YEAR, [Date of Birth], CURRENT_TIMESTAMP)
FROM dbo.Student AS s
INNER JOIN inserted AS i
ON s.[Student ID] = i.[Student ID]
WHERE i.[Date of Birth] IS NOT NULL;
commit transaction
END
GO
대단히 감사합니다 ... 사실 내 프런트 엔드는 한 번에 하나의 레코드 만 삽입하므로 코드가됩니다. 네, 이제 저는 Age 칼럼에 대한 여러분의 제안에 동의합니다. 정말 나쁜 생각입니다. 또한 나는 print 서술문이 필요 없다는 것을 알게되었다. 실제로 그것은 목적을 확인하기 위해 작성된 후 제거되지 않은 상태로 남았습니다. 마지막으로, 학생의 나이를 얻는 좋은 방법을 제안 할 수 있습니까? – Kameron
아마도 실제로 나이가 필요할 때만 호출되는 함수입니다. http://stackoverflow.com/questions/57599/how-to-calculate-age-in-t-sql-with-years-months-and-days –
나는 당신에게 한 가지 이상의 투표를 할 수 있기를 바란다. ! 다시 감사합니다. – Kameron