📅  最后修改于: 2020-11-30 09:30:59             🧑  作者: Mango
在本节中,我们将了解PostgreSQL ALTER TRIGGER命令的工作原理,并查看在PostgreSQL的指定表中更改触发器或重命名触发器的示例。
在PostgreSQL Trigger中,下一个命令是Alter Trigger命令,用于重命名现有触发器。
下图用于更改表中的触发器:
ALTER TRIGGER trigger_name
ON table_name
RENAME TO new_trigger_name;
在以上语法中,我们使用了以下参数:
Parameters | Description |
---|---|
Trigger_name | It is used to define the trigger name that we need to rename, and it is mentioned after the ALTER TRIGGER keyword. |
Table_name | The table_name parameter is used to define the table name, which is connected to the trigger. And it is used after the ON keyword. |
New_trigger_name | It is used to specify the new name of the trigger. And it is written after the RENAME TO keyword. |
让我们看一个示例示例,以了解PostgreSQL Alter Trigger命令的工作。
我们将在CREATE命令的帮助下,作为Student创建一个新表,并使用INSERT命令插入一些值。
要将学生创建到组织数据库中,我们使用CREATE命令。
但是,在创建学生表之前,我们将使用DROP TABLE命令检查组织数据库中是否已经存在类似的表。
DROP TABLE IF EXISTS Student;
输出量
执行上述命令后,我们将获得以下窗口消息: Student表不存在。
Student表包含各种列,例如Student_id,Student_name,Scholarship列,我们在其中将Student_id用作GENERATED ALWAYS AS IDENTITY约束。
CREATE TABLE Student(
Student_id INT GENERATED ALWAYS AS IDENTITY,
Student_name VARCHAR(50) NOT NULL,
Scholarship decimal(11,2) not null default 0,
PRIMARY KEY(Student_id)
);
输出量
执行上述命令后,我们将收到以下消息: Student表已成功创建到Organization数据库中。
成功创建Student表之后,我们将创建一个新函数,如果新奖学金大于旧奖学金的100%,则会引发异常:
CREATE OR REPLACE FUNCTION check_scholarship()
RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
BEGIN
IF (NEW. scholarship - OLD. scholarship) / OLD. scholarship >= 1 THEN
RAISE 'The scholarship raise cannot that high.';
END IF;
RETURN NEW;
END;
$$
输出量
执行上述命令后,我们将获得以下消息,该消息显示check_scholarship()函数已成功创建到组织数据库中。
创建check_scholarship()函数,我们将在更新触发器之前在Student表上创建一个新触发器,该触发器在更新奖学金之前执行check_scholarship()函数。
CREATE TRIGGER before_update_scholarship
BEFORE UPDATE
ON Student
FOR EACH ROW
EXECUTE PROCEDURE check_scholarship ();
输出量
执行完上述before_update_scholarship命令后,我们将获得以下消息窗口,该窗口显示已成功为Student表插入指定的触发器。
成功生成函数和触发器后,我们将在INSERT学生表中插入带有INSERT命令帮助的新行:
INSERT INTO Student(Student_name, scholarship)
VALUES('Mike Ross',100000);
输出量
实施上述命令后,我们将获得以下消息窗口,显示该特定值已成功插入到Student表中。
插入新行后,我们将使用以下UPDATE命令更新Student_id 1的奖学金:
UPDATE Student
SET scholarship = 200000
WHERE Student_id = 1;
输出量
在执行上述命令时,触发器被执行并引发错误,这表明奖学金的提高不能那么高。
要解决以上错误,我们将使用ALTER TRIGGER命令将before_update_scholarship触发器重命名为Scholarship_before_update 。
ALTER TRIGGER before_update_scholarship
ON Student
RENAME TO scholarship_before_update;
输出量
实施上述命令后,我们将获得以下消息窗口,该窗口显示特定触发器已成功从before_update_scholarship触发器重命名为Scholarship_before_update 。
我们将按照以下过程在psql中查看触发器:
步骤1
首先,我们将在本地系统中打开psql ,然后连接到要创建表的数据库。
第2步
为了连接组织数据库,我们将输入以下命令:
postgres=# \c Organization
输出量
执行上述命令后,我们将获得以下输出:
第三步
现在,我们将输入以下命令,以查看与组织数据库中的表链接的所有触发器。
Organization=# \dS Student
输出量
实现上述命令后,我们将获得以下输出,其中显示了现有触发器,这是组织数据库中存在的Scholarship_before_update:
注意:在\ dS命令中,字母S为大写字母,或者如果我们在字母s为小写字母的情况下使用\ ds,则会出现以下错误:
在PostgreSQL中,不包含OR REPLACE命令,该命令为我们提供了更改触发器说明的功能,如函数,将在执行触发器时实现。
因此,我们可以将这些命令包装在事务中,也可以使用CREATE TRIGGER和DROP TRIGGER命令。
让我们看一个示例示例,以了解DROP TRIGGER和CREATE TRIGGER命令在事务中如何工作。
以下命令表示如何将Scholarship_before_update触发器的check_scholarship()函数更改为validate_scholarship :
要开始交易,我们可以使用以下语句:
BEGIN;
输出量
执行完上述命令后,我们将获得以下消息窗口,该窗口显示指定的命令已成功实现。
成功启动事务处理过程之后,我们将执行以下DROP TRIGGER命令:
DROP TRIGGER IF EXISTS scholarship_before_update
on Student;
输出量
实施上述命令后,我们将获得以下输出,该输出显示特定触发器已成功从Student表中删除。
成功删除Scholarship_before_update触发器后,我们创建一个具有类似名称的新触发器Scholarship_before_udpate ,如以下命令所示:
CREATE TRIGGER scholarship_before_udpate
BEFORE UPDATE
ON Student
FOR EACH ROW
EXECUTE PROCEDURE check_scholarship();
输出量
实施上述命令后,我们将获得以下消息窗口,该窗口显示已成功为Student表插入特定的触发器。
为了使更改对其他会话(或用户)可见,我们需要借助COMMIT命令来提交事务,如下所示:
COMMIT;
输出量
实施上述命令后,我们将获得以下消息窗口,该窗口显示已成功为Student表提交事务。
在PostgreSQL ALTER Trigger部分中,我们学习了以下主题: