Создано ниже триггера в postgresql (для выполнения той же логики, что и для триггера sqlserver, определенного в приведенном ниже коде)
CREATE TABLE IF NOT EXISTS lookup_dbo.finlstatassetdesignation(
finlstatassetdesignation CHAR(10) NOT NULL,
finlstatassetdesignationdesc VARCHAR(50) NOT NULL,
updoperation NUMERIC(5,0) NOT NULL DEFAULT (0),
upddate TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CLOCK_TIMESTAMP()
);
CREATE OR REPLACE FUNCTION TR_FinlStatAssetDesignation_U_TrFunc()
RETURNS TRIGGER LANGUAGE plpgsql
AS $$
DECLARE
AtDateTime TIMESTAMP;
SWV_error INTEGER;
SWV_RowCount INTEGER;
BEGIN
SWV_error := 0;
GET DIAGNOSTICS SWV_RowCount = ROW_COUNT;
IF (SWV_RowCount = 0) then
RETURN NULL;
end if;
AtDateTime := LOCALTIMESTAMP;
if OLD.FinlStatAssetDesignation IS DISTINCT FROM NEW.FinlStatAssetDesignation then
RAISE EXCEPTION 'Invalid attempt to update OID FinlStatAssetDesignation in FinlStatAssetDesignation';
-- Rollback
RETURN NULL;
end if;
if not OLD.UpdDate IS DISTINCT FROM NEW.UpdDate then
SWV_error := 0;
begin
UPDATE lookup_dbo.finlstatassetdesignation
SET UpdDate = AtDateTime
WHERE a.FinlStatAssetDesignation = NEW.FinlStatAssetDesignation;
EXCEPTION
WHEN OTHERS
THEN
SWV_error := -1;
RETURN NULL;
end;
if SWV_error <> 0 then
-- RollBack
RETURN NULL;
end if;
SWV_error := 0;
end if;
RETURN NULL;
END; $$;
CREATE Trigger tr_finlstatassetdesignation_u
AFTER Update on lookup_dbo.finlstatassetdesignation FOR EACH ROW
EXECUTE PROCEDURE lookup_dbo.tr_finlstatassetdesignation_u_trfunc();
Исходный код триггера SQL Server: -
-- Add Update Trigger to FinlStatAssetDesignation
CREATE Trigger TR_FinlStatAssetDesignation_U on FinlStatAssetDesignation for Update NOT FOR REPLICATION as
IF (@@RowCount = 0) return
DECLARE @AtDateTime datetime
SELECT @AtDateTime = GETDATE()
if Update(FinlStatAssetDesignation)
Begin
RaisError( 'Invalid attempt to update OID FinlStatAssetDesignation in FinlStatAssetDesignation', 16, 1 )
Rollback Tran
return
end
if not Update(UpdDate)
begin
Update a
set UpdDate = @AtDateTime
from FinlStatAssetDesignation a, Inserted i
where a.FinlStatAssetDesignation = i.FinlStatAssetDesignation
if @@ERROR<>0
begin
RollBack tran
return/* Execution stops here! */
end
end
go
Преобразованный триггер в postgresql и даже в оригинальном sqlserver one состоит из 2 частей ... для первой ... кажется, что после конвертации в postgresql работает, но вторая часть не работает ... помогите