2017-12-07 3 views
0

테이블에 새로운 행이 생성 될 때마다 실행되는 트리거를 생성하려고합니다. 이런 일이 발생하면 행 삽입 방법을 반영하는 삽입 쿼리가 준비됩니다. 이 쿼리는 다른 데이터베이스의 테이블에 저장됩니다. 삽입 트리거시 데이터베이스에 문자열을 삽입하십시오.

는 설명하기 :

  • 데이터베이스 A는 테이블 제품 (ID, 이름, 기간, isavailable)가 있습니다.
  • 데이터베이스 B는 테이블 상 mysql_query (ID, 쿼리) 새로운 로우 (1001 '테스트 제품', 365은, 1) A.products 삽입

있고, 트리거가에 다음을 삽입해야 B.mysql_query :

INSERT INTO products (id, name, duration, value, isavailable) 
VALUES (1001, test product, 365, 1, 1) 

값은 기본적으로 항상 1입니다.

지금까지 트리거에 대한 코드는 다음과 같습니다

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER c_products 
ON migrimi_test.dbo.products 
AFTER INSERT 
AS 
    DECLARE @c_id INT; 
    SET @c_id = (SELECT id from inserted); 

    DECLARE @c_name INT; 
    SET @c_name = (SELECT name from inserted); 

    DECLARE @c_duration INT; 
    SET @c_duration = (SELECT duration from inserted); 

    DECLARE @c_isavailable INT; 
    SET @c_isavailable = (SELECT isvisible from inserted); 
BEGIN 
    SET NOCOUNT ON 

    INSERT INTO migrimi_temp.dbo.mysql_query (id, mysql_query) 
    VALUES (DEFAULT, 'INSERT INTO products (id, name, duration, value, isavailable) values ('+CAST(@c_id as nvarchar(50))+', '+'"'[email protected]_name'+'"'+, '[email protected]_duration+', 1, '[email protected]_isavailable+')') 
END 
GO 

나는 방아쇠를 실행하고 후자 삽입을 수행합니다. 이 오류 속담이다 :

Conversion failed when converting the nvarchar value 'test product' to data type int.

나는 그것이 변수 @c_name의 대체를 의미 이해는하지만 이것은 내가 쓰는 첫 번째 트리거, 그리고 내가 정확히 어떤 문제가 있는지 알 수 없습니다.

A와 B는 SQL 데이터베이스입니다.

WEI_DBA는 지적

1, @c_name이 선언 INT 그것이 VARCHAR 사실에도 불구하고, :

+1

'DECLARE @c_name INT; SET @c_name = (삽입 된 이름 선택),'name is nvarchar ...'@ c_name'을 nvarchar 데이터 유형으로 변경합니다. –

+0

또한, 하나의'Select' 문을 사용할 수 있습니다. '@c_id = id, @c_name = 이름, @c_duration = duration, @c_isavailable = 삽입 된 것으로부터의 보이지 않는 것 –

+0

@WEI_DBA : 네가 맞았다. 문자열이라도 변수 c_name을 int로 선언했다. 케이스). 또한 또 다른 오류가 발생했습니다. 그 질문의 업데이 트에 반영됩니다. 하지만 여전히 이와 비슷한 오류가 발생합니다. –

답변

0

좋아, 트리거 3 문제가 있었다.

2

은 분명히 모든 INT 변수가 VARCHAR로 캐스팅해야하거나 다음과 같은 오류가 발생합니다 :

sql trigger Conversion failed when converting the varchar value to datatype int

나는 아직도이 알아 낸 100 % 필요는 없습니다 -이 솔루션이지만 나는 이유를 인터넷 검색. 당연시되는 말을 듣지 말고 더 믿을만한 출처 나 대체 설명/솔루션을 자유롭게 제공하십시오. 결국 나는 방아쇠 초보자입니다.

3 트리거 자체가 작동하는 동안 @c_name (또는 모든 varchar 값) 값을 큰 따옴표로 묶지 않으면 mysql_query 테이블에 삽입 된 쿼리가 유효하지 않습니다.

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER c_products 
ON migrimi_test.dbo.products 
AFTER INSERT 
AS 
    DECLARE @c_id INT; 
    DECLARE @c_name nvarchar(100); 
    DECLARE @c_duration int; 
    DECLARE @c_isavailable INT; 
    Select @c_id = id, @c_name = name, @c_duration = duration, @c_isavailable = isvisible from inserted 

BEGIN 
    SET NOCOUNT ON 

    INSERT INTO migrimi_temp.dbo.sql_query (query) 
    VALUES ('INSERT INTO products (id, name, duration, value, isavailable, createdAt, updatedAt) values ('+CAST(@c_id as nvarchar(50))+', '+'"'[email protected]_name+'"'+', 
    '+CAST(@c_duration as nvarchar(50))+', 1, '+CAST(@c_isavailable as nvarchar(50))+', Now(), Now());') 
END 
GO 

새로운 필드를 무시, 내가 만든하지만 손의 문제와는 아무 상관이없는 수정이 있었다 :

작업 트리거의 최종 결과

는 다음과 같습니다.

+0

이 솔루션은 단일 행 삽입에 대해서는 작동하지만 다중 삽입에 대해서는 작동하지 않습니다 –

관련 문제