postgresql 如何将此触发器从TSQL转换为PL/pgSQL

4ioopgfo  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(138)

我在SQL Server中有此代码,并需要在PostgreSQL等效。

表和插入

CREATE TABLE  authentification (
    id int primary key,
    utilisateur varchar(15),
    typeCompte varchar(15)
)

CREATE TABLE droit (
    id int primary key ,
    description varchar(15),
)

insert into droit values (1, 'Description...')

CREATE TABLE permission (
    id_authentification int references authentification (id),
    id_droit int references droit (id),
    primary key(id_authentification,id_droit)
)

触发器

go 
  create trigger affectePermission
  on authentification
  after insert
  as
  begin
   declare @idAuthentification int
   set @idAuthentification = (select id from inserted)
   insert into permission values (@idAuthentification,1)
  end
 go
eulz3vhy

eulz3vhy1#

当然,让我们深入了解这个触发器从TSQL(SQL Server的SQL方言)到PL/pgSQL(PostgreSQL的SQL方言)的转换。这个触发器名为affectePermission,它在插入身份验证表后触发,将相应的记录插入权限表。
下面是您在PostgreSQL中如何定义类似的触发器:

CREATE OR REPLACE FUNCTION affecte_permission() RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO permission (id_authentification, id_droit) 
  VALUES (NEW.id, 1);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER affecte_permission
AFTER INSERT ON authentification
FOR EACH ROW EXECUTE PROCEDURE affecte_permission();

在TSQL触发器中,使用插入的特殊表来获取新插入行的id。在PostgreSQL中,你可以使用NEW特殊变量。NEW变量包含行级触发器中用于INSERT/UPDATE操作的新数据库行。还要注意,在PostgreSQL中,我们首先声明一个包含触发器操作的函数(在本例中为affecte_permission),然后使用CREATE TRIGGER语句将该函数绑定到表。
但是,您应该考虑到,虽然使用触发器可能会使数据库更加独立和“智能”,但它有时会使应用程序逻辑更难以理解或调试,因为它的一部分隐藏在数据库中。例如,如果您使用的是Sequelize、TypeORM或Hibernate之类的ORM,那么在应用层实现这种逻辑可能更容易维护。
请记住,始终要仔细权衡在数据库中实现逻辑与在应用程序中实现逻辑的利弊。
我希望这对你有帮助,编码快乐!

相关问题