Logon Trigger'lar SQL Server de güvenlik ve kontrol amaçlı kullanılabilen objelerdir. Eğer SQL Server Instance'a bağlananlar üzerinde kısıtlar uygulamak isterseniz tam olarak ihtiyacınızı Logon trigger ile karşılayabilirsiniz.
Şimdi bu konunun demosunu küçük bir senorya ile inceleyelim.
Örneğin kullanıcılarınızın veritabanına dışarıdan bilinmeyen bir bilgisayardan bağlanmasını engellemek istiyorsunuz. Yani sadece şirket bilgisayarından login olmasına izin vereceksiniz. Bu durumda kullanıcılarınız SQL Server login ile sysadmin(Full Yetki) yetkisine sahip olsa bile başka bir bilgisayardan bağlanma izni olmayacak.
Bunun için öncelikle küçük bir hazırlık çalışması yapmanız gerekecek. Şirket bilgisayarların isimlerini SQL Server'da bir tablo oluşturarak tutmanız gerekir. Ben aşağıdaki örnekte HostName adında bir tablo oluşturarak bilgisayar isimlerini burada tuttum.
Logon Trigger'ı prod ortamına almadan önce kesinlikle test ortamınızda denemenizi tavsiye ediyorum. Kodda gözden kaçan bir mantık hatası olursa bütün kullanıcıların SQL Server'la olan bağlantısını kesersiniz. Tabi bu durumu aşmanın da yolları mevcut ama genede sonradan uğraşmamak adına dikkat etmekte fayda var.
Logon Trigger'ı prod ortamına almadan önce kesinlikle test ortamınızda denemenizi tavsiye ediyorum. Kodda gözden kaçan bir mantık hatası olursa bütün kullanıcıların SQL Server'la olan bağlantısını kesersiniz. Tabi bu durumu aşmanın da yolları mevcut ama genede sonradan uğraşmamak adına dikkat etmekte fayda var.
Fakat bu kurgulanan senaryo çok sağlıklı değil. Çünkü her bilgisayar değişimi olduğunda ilgili tabloya tanımlama yapılması gerekmektedir. Ayrıca kişi başka bir bilgisayarın adını tabloda olan kayıtlardan biriyle eşleşecek şekilde değiştirirse de SQL Server'a erişim sağlama ihtimalide var. Daha güvenli ve jenerik bir yapı kurulması faydalı olacaktır.
Faydalı olması dileklerimle...
create TRIGGER pcName
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
if exists (select * from server_b.dbo.HostName
where name = (SELECT HOST_NAME()))
----Oluşturduğum
HostName tablosunda eğer girilmeye çalışan bilgisayar ismi yoksa trigger
tetiklenip rollback blogunun içerisine girecek ve kullanıcı bağlantı hatası
almış olacak.
begin
COMMIT
end
else
ROLLBACK
END
-- Triggeri silmek için bu kodu kullanabilirsiniz.
--DROP TRIGGER [triggerAdi] ON ALL SERVER