2017-12-07 13 views
0

テーブルに新しい行が作成されるたびに発生するトリガーを作成しようとしています。その場合、行の挿入方法を反映する挿入クエリが準備されます。このクエリは、別のデータベースのテーブルに格納されます。 挿入トリガーのデータベースに文字列としてクエリを挿入します。

を説明するために:

  • データベースAは、テーブル製品(ID、名前、期間、isavailable)を有しています。
  • データベースB新しい行(1001 '試験製品'、365、1)A.productsに挿入されると、テーブルするmysql_query(ID、クエリ)

を有し、トリガに以下を挿入しなければなりません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データベースです。

+1

'DECLARE @c_name INT; SET @c_name =(SELECT名が挿入されています); 'nameはnvarchar ...' @ c_name'をnvarcharデータ型に変更します。 –

+0

また、1つの 'Select'文を使用することもできます。 '@c_id = id、@c_name = name、@c_duration = duration、@c_isavailable =挿入からisvisibleを選択してください。 –

+0

@WEI_DBA:あなたは正しく、文字列であっても変数c_nameをintとして宣言していました(私の中のnvarchar場合)。また私は別のエラーがあった。それは質問の更新に反映されます。しかし、私はまだこれに似たエラーが発生しています。 –

答えて

0

OK]をクリックして、トリガーと3つの問題があった。WEI_DBAが指摘したように、@c_nameは、それが実際にはvarcharだったにも関わらず、int型

の1-宣言されました。

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

このソリューションは、単一行の挿入では機能しますが、複数の挿入では機能しません –

関連する問題