SSIS paketi SQL Server Agent job’da çalışmıyor

VS.NET’te hazırladığımız Integration Services projesindeki DTSX paketlerini belli periyotlarda çalışması için SQL Server Agent üzerinde Job tanımlarız. Job içerisinde SSIS paketini çağırdığımızda özellikle paket içerisinde tanımlanmış olan veritabanı bağlantısı, dosya işlemleri gibi bazı kaynaklara erişimin gerçekleşmediğine şahit oluruz. Örneğin source veya destination olarak tanımlanmış olan SQL Server sunucularına erişmeye çalışırken aşağıdaki gibi hata mesajları alabiliriz.
[OLE DB Source [1]] Error: SSIS Error Code DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. The AcquireConnection method call to the connection manager “Sunucu Adi” failed with error code 0xC0202009. There may be error messages posted before this with more information on why the AcquireConnection method call failed.
veya
Failed to decrypt protected XML node “DTS:Password” with error 0×8009000B “Key not valid for use in specified state.”. You may not be authorized to access this information. This error occurs when there is a cryptographic error. Verify that the correct key is available.
Bu sorunun muhtemel 2 nedeni bulunmaktadır;
1-SSIS paketinin yaratıcısı ile bu paketin SQL Server Agent altında çalıştıran kullanıcı farklıdır.
2-SQL Server Agent kullanıcısının veritabanlarıyla bağlantı kurmaya veya SSIS içerisinde kullanılan diğer kaynaklara erişme yetkisi bulunmamaktadır.
Bu sorunun çözümüne geçmeden önce aşağıdaki bilgiyi vermemiz faydalı olacaktır;
SSIS paketindeki ProtectionLevel özelliği paketteki veritabanı bağlantı şifresi gibi özel bilgilerin yazma ve okuma esnasında şifreleme düzeyini belirtir. Varsayılan EncryptSensitiveWithUserKey değerine sahip olan bu özellik sözkonusu SSIS paketindeki verileri mevcut kullanıcının profil ayarına göre şifreler. Bu durumda sadece aynı profile sahip kullanıcılar bu paketi çalıştırabilir. Eğer farklı kullanıcılar paketi çalıştıracak olursa önemli hassas bilgileri boş olarak değerlendirilir. ProtectionLevel özelliği için kullanılabilecek diğer değerler şunlardır;

  • DontSaveSensitive : DTSX dosyası kayıt edildiği zaman içindeki özel bilgilerin dosyaya kayıt edilmesi engellenir. Örneğin veritabanı bağlantısında şifre kullanılmışsa DTSX dosyası içerisinde ilgili alan şu şekilde görünecektir.
  • EncryptSensitiveWithUserKey : Bu durumda hassas bilgiler mevcut kullanıcının profile göre şifrelenir. Sözkonusu password alanı bu durumda aşağıdaki gibi yazdırılır.
    AQAAANCMnd8BFdE…
  • EncryptSensitiveWithPassword : Bu seçenekte paketteki önemli alanlar encrypt ederken bir şifre kullanılır. kullanıcının belirleyeceği şifre Security » PackagePassword bölümüne girilir. DTSX dosyasının çalıştırılması durumunda sözkonusu şifrenin de girilmesi gerekmektedir.
  • EncryptAllWithUserKey, EncryptAllWithPassword : Bu seçeneklerin önceki seçeneklerden tek farkı sadece önemli verileri değil tüm DTSX dosyasını encrypt edilir. Böylece dosya içeriğinin başka bir kullanıcı tarafından görülmesi okunması engellenmiş olur.
  • ServerStorage : SQL Server database rolerini kullanarak paketi korur. Bu seçenek paketin sadece SQL Server msdb veritabanına kayıt edildiği zaman kullanılabilir. Nitekim bu seçenek aktiften DTSX dosyası dosya sistemine yazılmaz.

Şimdi makaledeki sorunu aşmak için kullanılabilecek yöntemlere bakalım;
1 – SQL Server Agent proxy account kullanımı
SQL Server Agent için bir proxy hesabı oluşturulabilir. Bu hesabın hem job’ları çalıştırma yetkisi olmalı hem de DTSX dosyalarının sahibi olması gerekmektedir. Bu yöntem aynı makine üzerinde hem SQL Server Agent’in çalıştırıldığı hem de DTSX dosyalarının oluşturulduğu durumlarda anlamlıdır. Sözkonusu DTSX dosyaları başka bir makineye taşındığı zaman SQL Server Agent kullanıcısı farklı olacağından dolayı sorun yaşanabilir.
2 – ServerStorage seçeneği
SSIS paketinin ProtectionLevel özelliği ServerStorage olarak set edilir. Bu seçenek paketi doğrudan SQL Server’da saklar ve SQL Server database rollerinin kullanılmasını sağlar.
3 – ProtectionLevel = EncryptSensitiveWithPassword değeri
SSIS paketinin koruma düzeyini EncryptSensitiveWithPassword olarak set ederek bir çözüm oluşturabiliriz. SQL Server Agent Job içerisinden bu şifre girilerek SSIS paketi çalıştırılır.
4 – SSIS Package configuration dosyası oluşturmak
SSIS ile en önemli özelliklerden biri çalışma anınca paket içerisindeki property’lerin dışarıdan command line üzerinden veya konfigürasyon dosyası üzerinden set edilebiliyor olmasıdır. Konfigürasyon dosyasının içine paketteki hassas bilgilerin değerlerini yazdırılır. SSIS paketinin koruma düzeyinin ProtectionLevel olarak kayıt ettiğimizde tasarım aşamasında hassas bilgiler pakete yazılmayacağı için çalışma anında config dosyasından okuma yapılabilir.
SSIS paketini yapılandırma değerlerini saklamak için XML tabanlı bir konfigürasyon dosyası kullanılabildiği gibi Registry entry, Environment variable veya SQL Server table de kullanılabilir. SSIS konfigürasyonu için “SSIS » Package Configurations” menüsünden “Package Configurations Organizer” penceresi kullanılır. Bu pencerede Add, Edit, Remove düğmeleri kullanılarak paket içerisindeki nesneler ve onlara ait property’ler için değerler tanımlanabilir. Örneğin içeride kullanılmış olan veritabanı bağlantı şifreleri bu dosyada tutulabilir.
Bu işlemden sonra DTSX dosyasının içerisine aşağıdaki gibi satır eklenir. C:\dtsConfig Dosyasinin Yolu Job veya Command Line üzerinden SSIS paketini çalıştırmak için DTEXEC komutuna aşağıdaki gibi parametre yazılır.
/FILE “C:\Package1.dtsx” /CONFIGFILE “C:\SSIS_Ayarlar.dtsConfig” /CHECKPOINTING OFF /REPORTING E

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir