触发器可防止将数据插入表

时间:2018-11-29 17:13:54

标签: postgresql function stored-procedures triggers insert

我有以下问题: 我正在尝试将数据插入表中,但是我的触发器阻止了我执行插入操作。我的触发器是在输入给定的'year'<'2000'时将codigolle插入到日志表中,但是遇到以下错误:

”错误:查询没有结果数据的目的地   提示:如果要放弃SELECT的结果,请改用PERFORM。   上下文:PL / pgSQL函数funcaotriggerxx()在SQL语句“

的第5行

TRIGGER

const spawn = require('child_process').exec;

const doEcho = spawn('echo "hello world"');
doEcho.stdout.on('data', (data) => {
    if (data.includes('world')) {
        // run some other commands
    }
});

步骤

CREATE FUNCTION funcaoTriggerXX() RETURNS trigger AS $valor$
DECLARE
    cod INT;
BEGIN
    SELECT codigolivro 
    FROM edicao
    WHERE ano < '2000';

    cod = codigolivro;

    INSERT INTO log (codigolivro) VALUES (cod);

    RETURN cod;
END;
$valor$ LANGUAGE plpgsql;

CREATE TRIGGER codigoLivros AFTER INSERT ON edicao
EXECUTE PROCEDURE funcaoTriggerXX();

选择

CREATE OR REPLACE FUNCTION seculoxx()
RETURNS integer AS $total2$
declare
    total2 integer;
BEGIN
   SELECT count(*) into total2 
   FROM edicao
   WHERE ano < 2000;
   RETURN total2;
END;
$total2$ LANGUAGE plpgsql;

插入

SELECT seculoxx();

表的结构也很简单: edicao

  • 代码(数字)
  • 版本(字符)
  • 年份(整数)

日志

  • codigolivro

有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

首先,您的触发函数说它实际上返回trigger时返回INTEGER(NULL / OLD / NEW)。然后如错误所示,如果没有目标,就无法在plpgsql函数中执行SELECT。换句话说,您需要将SELECT语句的结果分配给变量。

SELECT codigolivro 
    INTO cod
FROM edicao
WHERE ano < '2000';

您的seculoxx()函数很好,但不需要中间变量:

RETURN count(*)
FROM edicao
WHERE ano < 2000;

答案 1 :(得分:0)

看看您在funcaoTriggerXXseculoxx中选择的查询有何不同。如果要存储来自选择查询的值,则需要SELECT column_name INTO variable_name。如果您不想保存结果,则需要使用PERFORM。例如。 PERFORM SELECT ...

您的语言与将执行的代码之间也存在差异。那就是你说的:

  

我的触发器是在输入给定的'year'<'2000'时将codigolle插入到日志表中

我认为您的意思是刚刚插入的行的codigolivro。但是,按现状。如果year < 2000表中的 any 行满足该条件,则该触发器实际上将在edicao处插入一个随机行。 相反,您可以使用NEW特殊变量来获取刚刚插入的行,并且可以使用WHEN的{​​{1}}子句来控制触发触发器的时间。

由于您只关心刚刚插入的行(不是整个表中的所有行),因此可以使用CREATE TRIGGER特殊变量。

NEW