2016-06-17 3 views
0

해당 테이블에 몇 개의 새 열을 만들기 전에 입력 할 수있는 테이블이 있습니다. 테이블은 History 테이블의 동일한 열을 사용하여 만든 로그 기록 테이블에 데이터를 삽입하는 UPDATE, DELETE 및 INSERT에서 트리거를 호출합니다.SQL Server 트리거가 데이터를 삽입하거나 수정하지 못하도록합니다.

이제 테이블에 데이터를 삽입 할 수 없습니다. 편집 옵션에서 행을 편집하면 .....이 오류가 표시됩니다.

No row was Updated. 
The data in row 1 was not committed 
Error Sources .net SQLClient Data Provider. 
Error Message: Incorrect syntax near the keyword where 
Correct the error and retry or press esc to cancel 

그러나 트리거를 사용하지 않으면 모든 것이 정상적으로 작동합니다.

트리거

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [magic ].[magic ] 
ON magic 
AFTER UPDATE, INSERT, DELETE 
AS 
    DECLARE @operation CHAR(20) 
    SET @operation= 'N' 

    IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) 
    BEGIN 
     SET @operation = 'Updated' 

     INSERT INTO magic.magic_HISTORY 
      SELECT *, @operation 
      FROM INSERTED 
    END 

    IF EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted) 
    BEGIN 
     SET @operation = 'Inserted' 

     INSERT INTO magic.magic_HISTORY 
      SELECT *, @operation 
      FROM INSERTED 
    END 

    IF NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) 
    BEGIN 
     SET @operation = 'Deleted' 

     INSERT INTO magic.magic_HISTORY 
      SELECT *, @operation 
      FROM deleted 
    END 
+3

magic_history 테이블에 트리거가 있습니까? 키워드 WHERE가 게시 한 코드에 나타나지 않습니다. –

+1

WHERE 절 구문 오류가 원래 쿼리에있을 수 있습니다. – Kaf

+0

당신은 몇 가지 새로운 열을 추가했다는 것을 언급하고, select *로이 테이블에 삽입 할 때이 열을 magic_History에 추가했음을 언급 함. Inserted –

답변

1

이 내 트리거라면 나는이 훨씬 간단하게 로직을 변경합니다. 무엇보다도 삽입 된 값을 감사하는 것은 중요하지 않습니다. 마법 테이블에있는 모든 값을 가지므로 두 번째 복사본이 중복됩니다. 이것은 감사를 조금 더 단순하게 만듭니다. 이전에 테이블에 있던 값만 신경 써야합니다. 그럼 변경

ALTER TABLE magic.magic_HISTORY ADD column 

경우 :

INSERT INTO magic.magic_HISTORY 
    SELECT *,@operation FROM 

INSERT INTO magic.magic_HISTORY (column list) 
    SELECT *,@operation FROM 
+0

그리고 아마도 '@ operation'의 데이터 형을'varchar (20)'로 변경하십시오. 오른쪽에 여분의 공백이있는 모든 문자열을 채우지 않아도됩니다! –

+1

좋은 지적 @marc_s. :) –

0

는 실행했다 삽입/업데이트를 사용하고 계십니까? 테이블? SQLProfiler를 사용하여 데이터베이스로 보내지는 특정 SQL을 캡처 할 수 있습니다. 어쩌면 트리거를 호출하는 랩핑 SQL에 구문 오류가있을 수 있습니다.

또한 기록에 삽입하기 전에 set nocount on 트리거를 추가하고 그 후에 set nocount off을 입력하십시오. 이렇게하면 드라이버가 트리거에서 오는 "행 영향"메시지로 인해 혼란에 빠질 가능성이 줄어 듭니다.

0

어떤 도구/응용 프로그램이 magic.magic_HISTORY에 열을 추가

ALTER TRIGGER [magic ].[magic ] on magic 
AFTER UPDATE, DELETE AS 

Declare @operation char(20) SET @operation= 'N' 

IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) 
    SET @operation = 'Updated' 

IF NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted) 
    SET @operation = 'Deleted' 

INSERT INTO magic.magic_HISTORY 
    SELECT *,@operation FROM deleted 
관련 문제