Postgres相当于SQL Server Inserted表而不是Trigger

时间:2018-04-12 04:03:12

标签: postgresql postgresql-9.3 postgresql-9.4 database-trigger

我正在尝试复制拦截插入并创建每条记录的哈希值,其中包括前一条记录的哈希值,我可以在SQL服务器上成功地使用而不是插入触发器,不幸的是我找不到任何内容Postgres文档说明我如何处理插入的记录集到表中,以便在最终提交集合插入之前计算这个转发的哈希到每个记录上。

我正在尝试创建一个简单的区块链,以便能够验证应该是仅附加数据库的内容是否未被篡改,因此我需要在Postgres中复制以下INSTEAD OF INSERT触发器:

DECLARE @tbl TABLE(rid INT, f INT, h VARBINARY(1000) null)

INSERT INTO @tbl(rid, f)
SELECT
      ROW_NUMBER() OVER( ORDER BY ... ASC)
    , id
FROM inserted

DECLARE @max INT, @curRecord INT, @pHash VARBINARY(1000)
SELECT @max = MAX(rid), @curRecord = 1 from @tbl

SELECT TOP 1 @pHash = hash FROM dbo.trx ORDER BY id DESC

IF @pHash IS NULL
BEGIN

 SET @pHash = CONVERT(VARBINARY(1000), 0)
END

DECLARE @cHash VARBINARY(1000)

WHILE(@curRecord <= @max)
BEGIN
    SELECT @cHash = HASHBYTES( 'SHA1', CONVERT(NVARCHAR(MAX), 
                                              CONVERT(VARCHAR,f) + 
                                          CONVERT(varchar(1000),@pHash, 1)))
                    FROM @tbl WHERE rid = @curRecord

    UPDATE @tbl SET h = @cHash  FROM @tbl WHERE rid = @curRecord

    SET @curRecord = @curRecord + 1
    SET @pHash = @cHash
    SET @cHash = NULL
END


INSERT INTO dbo.trx(id, hash)
SELECT f,h FROM @tbl ORDER BY rid ASC

0 个答案:

没有答案