Re: Trigger Procedure Hakkı

Lists: Postg윈 토토SQL :
From: "Ahmet" <corsairsoft(at)gmail(dot)com>
To: "PostgreSQL" <pgsql-tr-genel(at)postgresql(dot)org>
Subject: Trigger Procedure Hakkında
Date: 2006-04-07 08:53:46
Message-ID: 001201c65a20$c9c6cc6000000a@asus
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-tr-genel

Merhabalar,

MySQL' 5 te aşağıdaki şekilde kullandığım trigger' ı PostgreSQL de yazmaya çalışıyorum
hata vermiyor ama sonuçta vermiyor, aceba nerde hata yapıyorum ?

tablom

ID BIRIM ADET TOPLAM
----- ----------- ----------- -------------------
1 10 2 20
2 50 3 150

-- MySQL deki trigger

CREATE TRIGGER `hesapla` BEFORE UPDATE ON `tablom`
FOR EACH ROW
BEGIN
SET new.toplam = new.birim * new.adet;
END;

--PostgreSQL deki trigger

CREATE OR REPLACE FUNCTION "public"."fonksiyonum" () RETURNS trigger AS
$fonksiyonum$
BEGIN

new.toplam = new.birim * new.adet;

RETURN NULL; // RETURN NEW; < bunuda denedim

END;
$fonksiyonum$
LANGUAGE 'plpgsql';

CREATE TRIGGER "hesapla" AFTER UPDATE // BEFORE UPDATE denedim
ON "public"."tablom" FOR EACH ROW
EXECUTE PROCEDURE "public"."fonksiyonum"();


From: Volkan YAZICI <yazicivo(at)ttnet(dot)net(dot)tr>
To: Ahmet <corsairsoft(at)gmail(dot)com>
Cc: pgsql-tr-genel(at)postgresql(dot)org
Subject: Re: Trigger Procedure Hakkı
Date: 2006-04-07 18:59:51
Message-ID: 20060407185951.GA222@alamut
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg윈 토토SQL :

On Apr 07 11:53, Ahmet wrote:
> CREATE OR REPLACE FUNCTION "public"."fonksiyonum" () RETURNS trigger AS
> $fonksiyonum$
> BEGIN
>
> new.toplam = new.birim * new.adet;

Şöyle örnek bir kod parçası vereyim, hatanızı oradan seçin:

BEGIN;

CREATE TABLE trig_t (toplam integer, birim integer, adet integer);

CREATE FUNCTION trig_f() RETURNS trigger AS $$
BEGIN
NEW.toplam := NEW.birim * NEW.adet;
RETURN NEW;
END;
$$ LANGUAGE plpgsql STRICT VOLATILE;

CREATE TRIGGER trig_t_f
BEFORE UPDATE ON trig_t
FOR EACH ROW
EXECUTE PROCEDURE trig_f();

COPY trig_t FROM stdin;
100 10 1
200 20 2
300 30 3
400 40 4
500 50 5
\.

SELECT toplam, birim, adet FROM trig_t;
UPDATE trig_t SET birim = birim WHERE adet % 2 = 0;
SELECT toplam, birim, adet FROM trig_t;

ROLLBACK

> RETURN NULL; // RETURN NEW; < bunuda denedim

Yukarıdaki satır oldukça yanlış olmakla birlikte, bu şekilde
deneme-yanılma yöntemine başvurmaktansa PostgreSQL dökümantasyonunda
PL/pgSQL prosedürel dilinde trigger'ların nasıl oluşturulacağını
içeren bölüme bakmanız sizi cevaba daha çabuk götürebilir. (Özellikle
BEFORE ve AFTER trigger'larda NULL değer döndürmek ile ilgili kısma
bakınız.)

> CREATE TRIGGER "hesapla" AFTER UPDATE // BEFORE UPDATE denedim

Yukarıdaki paragraf burası için de geçerli. (Hatta bu kodu görünce "Acaba
BEFORE ve AFTER trigger arasındaki farkı gerçekten biliyor mu?" sorusu
aklımdan geçmedi değil.)

İyi çalışmalar.