rya*_*yan 3 sql postgresql triggers function
我正在尝试编写一个 SQL 触发器来比较新旧值。如果两个值不同,那么我需要显示一条错误,指出您无法更新名称。我的触发器的确切定义是
编写一个名为 disallow_team_name_update 的触发器函数,用于比较 OLD 和 NEW 记录团队字段。如果它们不同,则会引发异常,指出不允许更改团队名称。然后,将此触发器附加到名称为 tr disallow team name 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)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
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();
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 可以用来raise exception,嗯,引发异常。
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;
Run Code Online (Sandbox Code Playgroud)
您肯定不想禁止在insert上更改团队名称。(无论如何,PostgreSQL 不会让你这样做。)
CREATE TRIGGER tr_disallow_team_name_update
BEFORE UPDATE OF team ON group_standings
FOR EACH ROW EXECUTE PROCEDURE disallow_team_name_update();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8403 次 |
| 最近记录: |