PostgreSQL触发器函数无法正常工作



我有一个触发函数:

CREATE OR REPLACE FUNCTION Day_21_bankTriggerFunction()
RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
DECLARE
act VARCHAR(30);
BEGIN
SELECT account_number INTO act
DELETE FROM depositor
WHERE depositor.account_number = act;
RETURN act;
END;
$$;
`

然后我有一个触发器:

CREATE TRIGGER Day_21_bankTrigger AFTER DELETE on account FOR EACH ROW EXECUTE PROCEDURE Day_21_bankTriggerFunction()

这背后的想法是,如果从帐户表中删除了一个帐户,那么这应该触发函数运行,然后删除该帐户所在的存款人表上的所有记录。

我可以创建触发器函数和触发器而不会出现问题,但如果我试图从帐户表中删除帐户。。。当我不该看到的时候,我仍然会在储户表上看到账号。

有什么想法吗?

以上是我尝试过的。预期的结果是从账户表中删除一个账户,然后触发功能应该启动并从存款人表中删除该账户

通常,表之间的任何模式的关系都是由外键创建的。这是最好的方式,也是数据库的标准。使用外键可以控制数据。SQL示例:

CREATE TABLE contacts(
contact_id INT GENERATED ALWAYS AS IDENTITY,
customer_id INT,
contact_name VARCHAR(255) NOT NULL,
email VARCHAR(100),
PRIMARY KEY(contact_id),
CONSTRAINT fk_customer
FOREIGN KEY(customer_id) 
REFERENCES customers(customer_id)
ON DELETE SET NULL
ON UPDATE SET NULL
);

第三,指定REFERENCES子句中外键列引用的父表和父键列。

最后,在ON DELETEON UPDATE子句中指定删除和更新操作。删除和更新操作决定删除和更新父表中的主键时的行为。由于主键很少更新,因此ON UPDATE操作在实践中并不经常使用。我们将重点讨论ON DELETE行动。PostgreSQL在更新或删除后支持以下操作:

  • SET NULL(如果引用表上存在数据,则将值设置为NULL(
  • SET DEFAULT(如果引用表上存在数据,则将该字段的值设置为DEFAULT VALUES(
  • RESTRICT(类似于NO ACTION(
  • NO ACTION(如果引用表上存在数据,则无法更新或删除数据(
  • CASCADE(如果引用表上存在,则删除所有数据(

我为您编写了一个示例触发函数:

CREATE OR REPLACE FUNCTION Day_21_bankTriggerFunction()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
declare
act varchar(30);
begin
-- get account_number from deleted record
act = old.account_number; 
-- SECTION-1 :: Protect deleting if existing data
if (exists(select 1 from depositor where account_number = act)) then 
return null;
end if;
-- SECTION-1 :: END 

-- SECTION-2 :: Delete all data in the anothers table if exists */
delete from depositor where account_number = act;
return old; 
-- SECTION-2 :: END 
end
$function$;

CREATE TRIGGER Day_21_bankTrigger 
BEFORE DELETE on account 
FOR EACH ROW EXECUTE PROCEDURE Day_21_bankTriggerFunction();

在我的触发器函数中,我编写了两种类型的SQL代码。(SECTION-1SECTION-2(。你必须从中选择一个。

最新更新