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
stored procedure içinde alter trigger kullanamıyorum
s.a.
öncelikle şu linke bir bak..
viewtopic.php?t=5021
sonrada alter trigger komutlarını
ş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.
öncelikle şu linke bir bak..
viewtopic.php?t=5021
sonrada alter trigger komutlarını
Kod: Tümünü seç
exec statement 'buraya alter komutu'
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
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
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;
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;