11. January 2013
dearly
T-SQL
SQL server üzerindeki bir tabloya sadece belli bir procedure ile insert yapılmasını, direkt tablo üzerinde insert yapılamamsını sağlamak istiyoruz.
Bunu sağlamak için procedure içinde insert komutundan önce bir iz bırakıyoruz(CONTEXT_INFO). Insert trigger'ı içinde de bu izi arıyoruz. Eğer CONTEXT_INFO içindeki bilgi istediğimiz procedure e ait ise işlemi yapıyoruz. Değilse hata verdirtiyoruz.
Örnek Pocedure:
---************************************
---INSERT yaparken Prosedurun ismini CONTEXT_INFO ya ekliyoruz. Triggerda Prosedur ismi kontrol edilecek!
DECLARE @string VARCHAR(128) ,
@CONTEXT_INFO VARBINARY(128)
SET @string = ISNULL(OBJECT_NAME(@@PROCID), 'none')
SET @CONTEXT_INFO = CAST('Procedure=' + @string + REPLICATE(' ', 128) AS VARBINARY(128))
SET CONTEXT_INFO @CONTEXT_INFO
---***********************************
Trigger Örneği:
CREATE TRIGGER dbo.TRIGGER_ADI
ON dbo.TABLO_ADI
INSTEAD OF INSERT
AS
BEGIN
DECLARE @string varchar(128)
,@sCONTEXT_INFO varchar(128)=''
SELECT @sCONTEXT_INFO=CAST(CONTEXT_INFO() AS VARCHAR) FROM master.dbo.SYSPROCESSES WHERE SPID=@@SPID
IF @sCONTEXT_INFO IS NULL OR LEFT(@sCONTEXT_INFO,23)<>'Procedure=PROCEDURE_ADI'
BEGIN
DECLARE @errorMsg1 VARCHAR(500);
SET @errorMsg1 = 'TABLO_ADI TABLOSUNA SEDECE PROCEDURE_ADI PROSEDÜRÜ İLE KAYIT EKLENEBİLİR!' ;
RAISERROR(@errorMsg1,16,1)
END
ELSE
BEGIN
INSERT INTO TABLO_ADI
SELECT AlanAdi1,AlanAdi2,....
FROM INSERTED
END
END