Görünüşe göre SQL Server 2016 kullandığınız için, başka bir ' olası ' seçenek atmak istiyorum - SESSION_CONTEXT
.
Leonard Lobel'in SQL Server 2016'daki Paylaşım Durumu ileSESSION_CONTEXT
ilgili makalesi, SQL Server 2016'daki bu yeni işlevsellik hakkında çok iyi bilgilere sahiptir.
Bazı önemli noktaları özetlemek gerekirse:
Bir veritabanı bağlantısının ömrü boyunca oturum durumunu tüm saklı yordamlar ve gruplar arasında paylaşmak istiyorsanız, çok seveceksiniz SESSION_CONTEXT
. SQL Server 2016'ya bağlandığınızda, durum bilgisi olan bir sözlük veya genellikle durum çantası olarak adlandırılan bir sözcük, dizeler ve sayılar gibi değerleri depolayabileceğiniz ve atadığınız bir anahtarla alabileceğiniz bir yer alırsınız. Durumunda, SESSION_CONTEXT
anahtar herhangi bir dize ve değer bir sql_variant, yani çeşitli türleri barındırabilir.
Bir şeyleri SESSION_CONTEXT
, bağlantı kapanana kadar orada kalır. Veritabanındaki herhangi bir tabloda depolanmaz, bağlantı canlı kaldığı sürece bellekte kalır. Ve saklı yordamlar, tetikleyiciler, işlevler veya herhangi bir şey içinde çalışan herhangi bir T-SQL kodu içine ittiğini paylaşabilirsiniz
SESSION_CONTEXT
.
Şimdiye kadar sahip olduğumuz en yakın şey CONTEXT_INFO
, 128 bayta kadar tek bir ikili değeri depolamanıza ve paylaşmanıza olanak tanıyan, aldığınız sözlüğe göre çok daha az esnek olan ve SESSION_CONTEXT
farklı verilerin birden çok değerini destekleyen türleri.
SESSION_CONTEXT
kullanımı kolaydır, değeri istenen bir anahtarla kaydetmek için sadece sp_set_session_context'i arayın. Bunu yaptığınızda, anahtar ve değeri elbette sağlarsınız, ancak read_only parametresini true olarak da ayarlayabilirsiniz. Bu, oturum bağlamındaki değeri kilitler, böylece bağlantının geri kalanı boyunca değiştirilemez. Örneğin, bir istemci uygulamasının, veritabanı bağlantısını kurduktan hemen sonra bazı oturum bağlamı değerlerini ayarlamak için bu saklı yordamı çağırması kolaydır. Uygulama bunu yaparken read_only parametresini ayarlarsa, daha sonra sunucuda yürütülen saklı yordamlar ve diğer T-SQL kodu yalnızca değeri okuyabilir, istemcide çalışan uygulama tarafından ayarlananları değiştiremez.
Bir test olarak, bazı CONTEXT_SESSION
bilgileri ayarlayan bir sunucu oturum açma tetikleyicisi oluşturdum - bunlardan biri SESSION_CONTEXT
olarak ayarlandı @read_only
.
DROP TRIGGER IF EXISTS [InitializeSessionContext] ON ALL SERVER
GO
CREATE TRIGGER InitializeSessionContext ON ALL SERVER
FOR LOGON AS
BEGIN
--Initialize context information that can be altered in the session
EXEC sp_set_session_context @key = N'UsRegion'
,@value = N'Southeast'
--Initialize context information that cannot be altered in the session
EXEC sp_set_session_context @key = N'CannotChange'
,@value = N'CannotChangeThisValue'
,@read_only = 1
END;
Tamamen yeni bir kullanıcı olarak giriş yaptım ve SESSION_CONTEXT
bilgileri elde edebildim :
DECLARE @UsRegion varchar(20)
SET @UsRegion = CONVERT(varchar(20), SESSION_CONTEXT(N'UsRegion'))
SELECT DoThat = @UsRegion
DECLARE @CannotChange varchar(20)
SET @CannotChange = CONVERT(varchar(20), SESSION_CONTEXT(N'CannotChange'))
SELECT DoThat = @CannotChange
Hatta 'salt okunur' bağlam bilgilerini değiştirmeye çalıştım:
EXEC sp_set_session_context @key = N'CannotChange'
,@value = N'CannotChangeThisValue'
ve bir hata aldı:
Msg 15664, Seviye 16, Durum 1, Yordam sp_set_session_context, Satır 1 [Toplu Başlangıç Satırı 8] Oturum bağlamında 'CannotChange' anahtarı ayarlanamıyor. Anahtar, bu oturum için salt okunur olarak ayarlandı.
Giriş tetikleyicileri hakkında önemli bir not ( bu gönderiden )!
Oturum açma tetikleyicisi, sysadmin sabit sunucu rolünün üyeleri de dahil olmak üzere tüm kullanıcılar için Veritabanı Altyapısı'na başarılı bağlantıları etkili bir şekilde önleyebilir. Oturum açma tetikleyicisi bağlantıları engelliyorsa, sysadmin sabit sunucu rolünün üyeleri özel yönetici bağlantısını kullanarak veya Veritabanı Altyapısı'nı en az yapılandırma modunda (-f) başlatarak bağlanabilir.
Potansiyel bir dezavantaj, bunun oturum bağlamı örneğini (veritabanı başına değil) doldurmasıdır. Bu noktada, düşünebileceğim tek seçenek:
Session_Context
Başka bir veritabanında aynı tür adında bir çarpışmaya neden olmamak için ad-değer çiftlerinizi veritabanı adıyla önek olarak adlandırın. Bu, Session_Context
tüm kullanıcılar için TÜM ad değerlerini önceden tanımlama sorununu çözmez .
- Oturum açma tetikleyicisi tetiklendiğinde
EventData
, oturum açma kullanıcısını ayıklamak için kullanabileceğiniz (xml) erişimine sahip olursunuz ve buna dayalı olarak, belirli Session_Context
ad-değer çiftleri oluşturabilirsiniz.