SSIS (SQL Server Integration Services)— Environment Variable Kullanımı
Bu yazıda SSIS projeleri içinde kullanılan Connection Manager’ları parameterize ederek ortam bazlı farklı değerler ile beslemek için yapılması gereken teknik çalışmalardan bahsedeceğiz.
SSIS projelerinde db bağlantısı yaptığımız noktalarda Connection Manager’lar kullanmaktayız. Bu ConnectionManager’lar veritabanı sunucumuza bağlanabilmemiz için sunucu adı, veritabanı adı, kullanıcı adı ve şifre gibi gerekli bağlantı bilgilerini içermektedir. Daha sonra bu tanımladığımız Connection Manager’ları herhangi bir dtsx paketi içerisinde kullanabiliriz. Örneğin A isimli db için A.conmgr isimli bir bağlantı tanımlayabiliriz aynı zamanda B isimli db için b.conmgr isimli bir bağlantı tanımlayabiliriz.
SSIS projeleri bildiğiniz gibi genelde raporlama veya veri ambarı oluşturma için kullanılan teknolojiler olduğu için ve bu teknolojiye ihtiyaç duyan firmaların production ortamı dışında development ve test ortamı gibi birden fazla ortamı olması muhtemeldir. Bir ssis projesi üzerinde geliştirme yapılırken direkt üretim ortamına bakarak geliştirme yapmamız da doğru bir yöntem olmayacaktır. Bu durumda örneğin biz geliştirmemizi development db’lerine bakacak şekilde yapıp aynı zamanda diğer ortamlarda da çalışabilecek durumda olmasını sağlamalıyız. Bu aslında web projelerindeki web.config ile aynı mantık olarak düşünebilirsiniz. SSIS projeleri için de aynı durum söz konusudur, yazdığımız connection manager’ların deploy ettiğiniz ortama göre farklı db bağlantı bilgilerini alabiliyor olması gerekmektedir. Yani elinizde bir SSIS projesi olduğunu varsayalım, içinde birçok dtsx paketi bulunmakta ve bu paketlerin kullandığı bir ya da daha fazla db bağlantısı bulunmakta. İlgili projeyi test ortamına deploy ettiğimizde dtsx içindeki sorgular test db sunucusunda çalışmalı, üretim ortamına deploy ettiğinizde ise dtsx içindeki sorgular üretim db sunusunda çalışmalı.
Bu noktada Environment Variable’lar devreye giriyor. Environment Variable’lar SQL sunucusu üzerinde Integration Services Catalog altında yer alan SSIS projelerinin içinde Variable tanımlamaları yapabiliyoruz. Fakat bu tanımlanan variable’ların işe yaraması için projemizin içinde connection manager’ların içinde yer alan bağlantı bilgileri Parameterize edilmesi gerekmektedir. Bir dtsx paketi içinde parameterize edilmiş bir bağlantı var ise bu paketi sunucu üzerinden çalıştırdığımızda ilgili parametrelerin hangi değerleri alacağını manuel çalıştırmalarda elle girebileceğimiz gibi environment içindeki variable’lardan okumasını da sağlayabiliyoruz.
Environment Variable’ların sadece db bağlantıları için değil herhangi bir paketin parameterize edilmiş herhangi bir özelliği için kullanabileceğimizi belirtmekte fayda var. En sık ihtiyaçlardan biri db bağlantısı olduğu için biz de bu örnek üzerinden yazımıza devam edeceğiz
Not: Kullanıcı şifresi, ftp şifresi gibi hassas bilgileri tutan proje parametreleri Sensitive olarak işaretleyebiliyoruz. Bu parametrelere karşılık gelen Environment Variable’ları da Sensitive olarak işaretleyerek başkaları tarafından görüntülenmesini engelleyebilirsiniz.
Connection Manager’ları Parameterize Etme
Environment Variable’lar ile çalışmanın en kolay yolu öncelikle dtsx paketlerindeki parametreleri kullanmaktır. Paketteki parametreler, paketin yürütülmesi sırasında değeri değişmez, SSIS içindeki Environment Variable gibi davranır. Parametreler çalıştırılacak olan paketlerin alacağı değerleri yönetmek için tasarlanmış yapılardır. Parametre tanımlamalarınız paket düzeyinde veya proje düzeyinde olabilir. Aynı parametreleri kullanan bir SSIS projemiz olduğunu varsayalım.
Project.params’a çift tıkladığınızda, proje parametreleri oluşturabileceğiniz bir sekme açılacaktır. Görselde gösterilen ConnectionManager için sunucu adını tutacak bir parametre oluşturalım.
Required özelliğinin True olarak ayarlanması, deployment’dan sonra parametrenin değerini değiştirmemiz gerektiği anlamına gelir. Required True olmaz ise paket çalıştırıldığında ilgili parametre boş olursa sorun yaratacaktır. Artık Connection Manager içindeki değerleri parameterize edebiliriz.. Parametre değerini değiştirdiğinde, Connection Manager de buna göre değişecektir. Bir dtsx paketi içinde kullandığımız proje bazlı Connection Manager’a sağ tıklayıp Parameterize dediğimizde yeni bir ekran açılacaktır.
Açılan bu ekranda sunucu adı, db adı, kullanıcı adı ve şifre gibi özellikleri parameterize edebilirsiniz. Görselde sunucu adı özelliğini proje üzerindeki parametreden alacak şekilde ayarladık.
Artık parametre değerini değiştirerek sunucular arasında kolayca geçiş yapabiliriz. Bir Connection Manager parameterize edildiğini yanında çıkan fx ikonu ile onu kolayca fark edebilirsiniz.
Geliştirme bittiğine göre artık projeyi SSIS kataloğuna deploy edebiliriz.
SSIS kataloğundaki projeye sağ tıklayıp Configure diyerek proje parametrelerini görebilirsiniz.
İlk aşamada parametre değerleri boş çünkü ilgili parametre Required olduğu için deployment sonrası açıkça bir değer ataması yapılmalı.
Üç noktaya tıklayarak parametre değerini yapılandırabiliriz. Parametre Required olduğundan varsayılan değer pasif gelir.
Paketleri çalıştırabileceğimiz 3 farklı sunucu varsa her seferinde parametre değerlerini manuel değiştirmek istemeyiz. Bu problemi çözmek için Environment tanımlamaları yapılmalıdır.
SSIS Paketlerinde Environment Tanımlama
Bir db sunucudaki katalog altındaki Environment’ın Properties’lerine baktığınızda config dosyası gibi olduğunu görebilirsiniz. Bu Environments altına yeni bir Environment ekleyebilirsiniz.
Açılan pencerece, Environment’e bir ad ve açıklama verebilirsiniz.
Bir sonraki adımda Environment içine bir Variable ekleyebiliriz. Environment özelliklerine geri döndüğünüzde Variable’lar için bir sekme göreceğiz. Burada proje parametremizi yapılandırmak için bir Variable ekleyebiliriz.
Parametreleri Environment ile Besleme
Son adım, Environment Variable’larını proje parametremize bağlamaktır. Amaç, bir paketi çalıştırdığımızda ortamlar arasında kolay geçiş yapmabilmeyi sağlamaktır.
Öncelikle proje ile Environment arasında bir referans oluşturmamız gerekiyor. Bunu proje konfigürasyonuna geri dönerek yapabilirsiniz. Referanslar sekmesinde referans ekleyebiliriz. Bu aynı proje içindeki bir Environment referansı (local) olabileceği gibi aynı sunucudaki farklı bir projeye ait Environment referansı (absolute) da olabilir. Bir projeyi başka bir klasöre taşısak bile Absolute referanslar geçerli kalır ve aynı ortamı göstermeye devam eder. Local referanslar, geçerli klasörde aynı ada sahip bir Environment arayacaktır.
Son adım, Environment Variable parametreye bağlamak için SSIS projesine sağ tıklayıp Configure dedikten sonra parametrelerin listelendiğini göreceğiz. Herhangi bir parametrenin yanındaki üç noktaya bastığımızda “Set Parameter Value” ekranı açılacaktır. Bu ekranda ilgili parametrenin hangi Environment Variable’ı üzerinden besleneceğini seçebilirsiniz.
Parametrenizin birden çok Environment tarafından yapılandırılabilir olmasını istiyorsanız, tüm Environment’ların aynı adı paylaşan bir Variable’lara sahip olması gerekir.
Artık bir paket çalıştığında bir Environment seçmeliyiz. Bunu yaptığımızda ilgili Environment içindeki değerler parametrelere iletilecektir. Paket çalıştığında, Connection Manager değerleri parametrelerden beslenecektir. Farklı bir Environment seçerek SSIS paketini başka bir sunucuda çalıştırabiliriz.
Paket çalıştırıldıktan sonra, Overview raporunda Environment Variable değerinin kullanıldığını kontrol edebiliriz.
Automic’den Environment Bazlı Paket Çalıştırma
SSIS üzerinden parameterize edilmiş bir paketi çalıştırırken environment bazlı çalıştırmayı gördük. Biz paketlerimizi çalıştırmak için Automic aracını kullanıyoruz. Automic üzerinden bir dtsx paketini tetiklediğimizde de aynı şekilde hangi environment’ın kullanılacağını belirtmemiz gerekir.
Görselde de göründüğü gibi,
DTExec /ISSERVER “\SSISDB\Test\SSIS2016\SSIS2016.dtsx” /SERVER “.” /Envreference &ENVREFERENCEID# /Par “$ServerOption::SYNCHRONIZED(Boolean)”;True
şeklinde bir tanımlama ile &ENVREFERENCEID# bölümü ilgili iş tetiklenmeden önce dinamik olarak Automic’den beslenecek şekilde ayarlanabilir veya statik olarak 1,2,3,..10 ilgili Referans Id’niz ne ise onu belirtebilirsiniz.
Environment ReferanceId’leri gormek icin aşağıdaki sorgu SSIS sunucusunda çalıştırabilirsiniz.
SELECT p.name as projectName , er.* FROM SSISDB.catalog.environment_references er join SSISDB.catalog.projects AS P on P.project_id = er.project_id
Environment ve Variable’ları kullanarak SSIS paketlerinin davranışını dinamik olarak yapılandırabiliriz. Ortamları kullanmanın avantajı, farklı projelerde kolayca yeniden kullanılabilen tüm konfigürasyonların merkezi bir deposuna sahip olmaktır. Birden çok Environment kullanarak, SSIS paketleriniz için farklı yürütme senaryoları uygulayabilirsiniz.