将SQL Server触发器转换为PostgreSQL会触发触发器函数的问题

时间:2011-07-12 10:32:51

标签: postgresql

我正在将现有的SQL Server 2005数据库转换为PostgreSQL 9.0数据库。

到目前为止一切正常。我想将SQL触发器转换为PostgreSQL,但是触发器功能有问题。

我不知道如何在PostgreSQL语法中实现临时表inserted。在SQL Server中,inserted表存在但不存在于PostgreSQL中。有什么想法吗?

我的代码(PostgreSQL):

CREATE OR REPLACE FUNCTION func_co_insert()

  RETURNS trigger AS

$BODY$begin

  declare

  aa bigint;

begin

  select aa = co_id from inserted;

  update com03 set co_creationdate = CURRENT_TIMESTAMP,

  co_creationby = USER where co_id = aa;

end;

end;

这里是SQL Server 2005代码的触发器主体的代码

begin

    declare @aa bigint;

    select @aa = se_id from inserted;

    update server set se_creationdate = CURRENT_TIMESTAMP , se_creationby = USER where se_id = @aa;

end;

感谢

克里斯

1 个答案:

答案 0 :(得分:3)

PostgreSQL中的默认值是行级触发器(而不是SQL Server,它是语句级触发器),因此不需要“插入”表来进行选择。

可以使用关键字newold访问新旧值(插入触发器不存在旧值)。

在您的情况下,声明只是:

  update com03 
       set co_creationdate = CURRENT_TIMESTAMP,
       co_creationby = CURRENT_USER
  where co_id = new.co_id;

无需“从插入中选择”。

这假设触发器触发表com03。如果您的触发器触发com03(您没有告诉我们),那么它就更容易了:

  new.co_creationdate := current_timestamp;
  new.co_creationby := current_user;

有关详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/plpgsql-trigger.html

该页面还包含一个完全符合您要实现的目标的示例