Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写SQL触发器以比较新旧值_Sql_Postgresql_Function_Triggers - Fatal编程技术网

编写SQL触发器以比较新旧值

编写SQL触发器以比较新旧值,sql,postgresql,function,triggers,Sql,Postgresql,Function,Triggers,我正在尝试编写一个SQL触发器来比较新旧值。如果两个值不同,那么我需要显示一个错误,说明无法更新名称。我的触发器的确切定义是 编写一个名为disallow\u team\u name\u update的触发器函数,用于比较 新旧记录团队字段。如果他们不一样,提出一个建议 声明不允许更改团队名称的异常。 然后,将此触发器附加到名为tr disallow team的表 命名update并指定它在对的任何潜在更新之前激发 队员们在桌上打了个球 我用于解决此问题的表格是: Table "table.

我正在尝试编写一个SQL触发器来比较新旧值。如果两个值不同,那么我需要显示一个错误,说明无法更新名称。我的触发器的确切定义是

编写一个名为disallow\u team\u name\u update的触发器函数,用于比较 新旧记录团队字段。如果他们不一样,提出一个建议 声明不允许更改团队名称的异常。 然后,将此触发器附加到名为tr disallow team的表 命名update并指定它在对的任何潜在更新之前激发 队员们在桌上打了个球

我用于解决此问题的表格是:

  Table "table.group_standings"
    Column |         Type          | Modifiers
   --------+-----------------------+-----------
    team   | character varying(25) | not null
    wins   | smallint | not null   
    losses | smallint | not null
    draws  | smallint | not null
    points | smallint| not null
   Indexes:
     "group_standings_pkey" PRIMARY KEY, btree (team)
  Check constraints:
   "group_standings_draws_check" CHECK (draws >= 0)
   "group_standings_losses_check" CHECK (losses >= 0)
   "group_standings_points_check" CHECK (points >= 0)
   "group_standings_wins_check" CHECK (wins >= 0)
这是我的密码:

CREATE OR REPLACE FUNCTION disallow_team_name_update() RETURNS trigger AS $$
    BEGIN
            if(NEW.team <> OLD.team)
            /*tell the user to not change team names*/

    END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER tr_disallow_team_name_update BEFORE INSERT OR UPDATE OF team ON group_standings 
FOR EACH ROW EXECUTE PROCEDURE disallow_team_name_update();
CREATE或REPLACE函数disallow\u team\u name\u update()将触发器返回为$$
开始
如果(新团队旧团队)
/*告诉用户不要更改团队名称*/
结束;
$$语言plpgsql;
在小组排名上插入或更新团队之前,创建触发器tr_不允许团队名称_更新
对于每一行,执行程序disallow_team_name_update();

PostgreSQL可以使用
引发异常
来引发异常

CREATE OR REPLACE FUNCTION disallow_team_name_update() 
RETURNS trigger AS 
$$
    BEGIN
        if(NEW.team <> OLD.team) then
            raise exception 'Invalid update.'
            using hint = 'Changes to team name are not allowed.';
        end if;

    END
$$ 
LANGUAGE plpgsql;

... 您的代码不应该返回旧的团队名称,如果您试图更改它,它应该抛出一个错误。你犯了什么错误?@Clockwork Muse如果你是对的,我如何更改它以显示错误而不是旧团队?我得到的错误是psql:tables.sql:48:error:sql表达式第5行末尾缺少“THEN”:returnold.team;。。。我要说的是,这个错误正是告诉你当前声明的错误所在。错误实际上属于问题的一部分。实际上,我很惊讶它没有抱怨双等于(
==
),因为SQL使用上下文敏感的单等于进行比较。假设您可以使用in equality运算符检查名称是否不匹配,尽管我不知道如何让PostrgeSQL故意抛出异常。将您的函数粘贴到您的问题中。@Clockwork Muse:PostgreSQL使用神秘命名的
引发异常
。非常感谢您的帮助。你还在网上回答另一个快速问题吗?
CREATE TRIGGER tr_disallow_team_name_update 
BEFORE UPDATE OF team ON group_standings 
FOR EACH ROW EXECUTE PROCEDURE disallow_team_name_update();