stored procedure içinde alter trigger kullanamıyorum

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

stored procedure içinde alter trigger kullanamıyorum

Mesaj gönderen akdatilla »

Merhaba arkadaşlar
Bir stored procedure içinde tabloya bağlı triggerleri kullanıma kapatarak tabloda değişiklik yapmayı, sonra tekrar triggerleri kullanıma açmayı istiyorum. Ancak SP içerisinde Alter trigger kullanınca Alter de ne demek gibi bir hata mesajı alıyorum. Lütfen Yardım!

CREATE PROCEDURE SFCHAZIRLA(VSFC_SFA INT)
AS
BEGIN
ALTER TRIGGER sfcdeltrigger inactive;
ALTER TRIGGER sfcinstrigger inactive;
ALTER TRIGGER sfcuptrigger inactive;
DELETE FROM SFISTRG
WHERE NOT SFC_ID IN (SELECT SFC_ID FROM SFISTRG INNER JOIN SFISB ON (SFB_ID=SFC_ID));
IF (EXISTS(SELECT * FROM SFISTRG WHERE SFC_SFA=:VSFC_SFA)) THEN
BEGIN
DELETE FROM SFISTRG WHERE SFC_SFA=:VSFC_SFA;
END

ALTER TRIGGER sfcdeltrigger active;
ALTER TRIGGER sfcinstrigger active;
ALTER TRIGGER sfcuptrigger active;
END
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
öncelikle şu linke bir bak..
viewtopic.php?t=5021

sonrada alter trigger komutlarını

Kod: Tümünü seç

exec statement 'buraya alter komutu'
şeklinde yaz...
birde sadece delete trigerini iptal etsen yetmezmi?
kolay gelsin.
not : exec statement execute statement şeklinde de olabilir. şu an editor yok bakamıyorum.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Mesaj gönderen akdatilla »

a.s.
Allah razı olsun. Çok faydalı olacak bilgiler verdiniz.
Ancak bu sp içinde triggerlerin doğrudan bir komutla kapatılamıyor
olması (en azından ben yapamadım) büyük bir eksiklik bence firebird için.
Ben en son aşağıdaki örnek kodlar ile çözüme gitmeyi düşünüyorum.
Başka fikirleri olanlar lütfen görüşlerini eklesin.

CREATE TABLE TETIKLEYICI
(
TRG_ADI VARCHAR(50) NOT NULL,
TRG_SWC SMALLINT NOT NULL,
PRIMARY KEY (TRG_ADI)
);

CREATE TRIGGER SFCDELTRIGGER FOR SFISTRG
AFTER DELETE
AS
declare variable VSNC INT;
BEGIN
if (EXISTS(select * FROM TETIKLEYICI WHERE TRG_SWC=1 AND
TRG_ADI = 'SFCDELTRIGGER')) then
BEGIN
execute procedure SFBSIL OLD.SFC_SFA,OLD.SFC_SIRA,0 returning_values :VSNC;
END
END

CREATE PROCEDURE SETTRIGGERACTIVATE(VTRIGGER VARCHAR(50),VACTIVATE INT)
AS
BEGIN
UPDATE tetikleyici SET TRG_SWC=:VACTIVATE WHERE TRG_ADI = :VTRIGGER;

END

INSERT INTO TETIKLEYICI (TRG_ADI,TRG_SWC) VALUES ('SFCDELTRIGGER',1);

CREATE PROCEDURE DENSETTRG
AS
declare variable VSWC INT;
BEGIN
EXECUTE procedure settriggeractivate('SFCDELTRIGGER',0);
DELETE FROM sfistrg;
EXECUTE procedure settriggeractivate('SFCDELTRIGGER',1);
END

execute procedure DENSETTRG;
Cevapla