【问题标题】:Insert query as string in database on insert trigger在插入触发器上将查询作为字符串插入数据库中
【发布时间】:2017-12-07 19:00:44
【问题描述】:

我正在尝试创建一个触发器,该触发器将在每次在表中创建新行时触发。发生这种情况时,将准备一个插入查询,以反映该行的插入方式。此查询将存储到另一个数据库的表中。

举例说明:

  • 数据库 A 有表产品(id、name、duration、isavailable)。
  • 数据库B有一个表mysql_query(id,query)

当新行 (1001, 'test product', 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))+', '+'"'+@c_name'+'"'+, '+@c_duration+', 1, '+@c_isavailable+')' )
END
GO

我运行触发器,然后执行插入。有一个错误说:

将 nvarchar 值“测试产品”转换为数据类型 int 时转换失败。

我知道它指的是变量@c_name的替换,但这是我写的第一个触发器,我不知道到底是什么问题。

A 和 B 是 SQL 数据库。

【问题讨论】:

  • DECLARE @c_name INT; SET @c_name = (SELECT name from inserted); name is nvarchar... 将 @c_name 更改为 nvarchar 数据类型。
  • 另外,您可以使用一个Select 语句。 Select @c_id = id, @c_name = name, @c_duration = duration, @c_isavailable = isvisible from inserted
  • @WEI_DBA:你是对的,我将变量 c_name 声明为 int 即使它是一个字符串(在我的例子中是 nvarchar)。我还有另一个错误。这将反映在问题的更新中。但我仍然收到与此类似的错误。
  • 发布您更新的查询以及错误。

标签: sql-server database triggers


【解决方案1】:

好的,触发器有 3 个问题:

1- 正如 WEI_DBA 指出的那样,@c_name 被声明为 int,尽管它实际上是一个 varchar。

2- 显然,每个 int 变量都应该转换为 varchar,否则会抛出以下错误:

将varchar值转换为sql触发器时转换失败 数据类型 int

我仍然没有 100% 解决这个问题 - 这是解决方案,但我正在谷歌搜索原因。因此,不要认为我的话是理所当然的,请随时提供更可靠的来源或替代解释/解决方案。毕竟我是触发新手。

3- 虽然触发器本身可以工作,但插入到表 mysql_query 中的查询将无效,除非值 @c_name(或任何 varchar 值)被双引号括起来。

一个工作触发器的最终结果如下:

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))+', '+'"'+@c_name+'"'+', 
    '+CAST(@c_duration as nvarchar(50))+', 1, '+CAST(@c_isavailable as nvarchar(50))+', Now(), Now());' )
END
GO

忽略新字段,我做了一些修改,但与手头的问题无关。

【讨论】:

  • 此解决方案适用于单行插入,但不适用于多行插入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多