2011-04-01 10 views
8

Grafik çizmesi ve diske kaydetmesi gereken basit bir UDF yazdım. Aslında, SQL Server ve R arasında bir UDP olarak bir UDF kullanıyorum, bu yüzden UDF sadece R komutunu R motoruna DCOM üzerinden SQL SERVER'den geçirir. Her şey bir grafik çizmeye veya diske kaydetmeye çalışana kadar iyi çalışıyor. Meclisi UNSAFE izinleriyle oluşturdum.Sql Sunucu CLR dosya sistemi erişimi UDF'den

Yani, şöyle gider: SQL Engine -> UDF -> (D) COM SUNUCUSU -> R -> (D) COM SUNUCUSU -> UDF -> SQL Engine.

Yani, ilk sorunum, bir UDF'den GUI oluşturabilir miyim? Sanırım değil ama sormaya değer.

İkinci sorun, neden UNSAFE izinli bir derlemenin dosya sistemine erişemediğidir. Herhangi bir hata almıyorum, sadece hiçbir şey olmuyor.

R ortamı farklı adres alanında olduğundan, SQL Engine'den CLR'ler için izinlerin bunu etkilemesinin herhangi bir nedenini göremiyorum.

Teşekkür

Düzenleme:

Ben prosedürlere aynı şeyi yapmaya çalıştı. Şimdi boş bir dosya oluşturuldu. Bu benim R test kodum:

jpeg("C:\\test1.jpg"); x <- rnorm(100); hist(x); dev.off() 

Burada neler olduğu hakkında bir fikriniz var mı? hala hiçbir hata varsa Dosya sistemi erişimi

  • izin verdiği

  • +0

    SysInternals Filemon veya Process Monitor çalıştırır ve derleme işleminin dosya sisteminde ne yapmaya çalıştığını belirler. Bu araçlardan birini kullanarak görünürlük kazanabilirsiniz. –

    cevap

    2
    1. Sen sunucu tarafı kod
    2. GÜVENSİZ bir GUI başlatamazsınız tehlikelidir, EXTERNAL_ACCESS Kodunuzdaki bu iyi bir şans var, daha iyi olurdu doğru çalışıyor ancak yapmasını beklediğinizden farklı bir şey yapıyor; bazı hata ayıklama kodunu ekleyebilir veya bir hata ayıklayıcı ekleyebilir misiniz? Eğer bu şekilde şeyler yapıyoruz niye they are much more flexible

    Ama bu açık çünkü

  • bir prosedür UDF daha burada daha uygundur. Veritabanından veri almak, R programınızı çağırmak ve görüntüyü kaydetmek için SQL Server dışında küçük bir (?) Program yazmak çok daha kolay olacaktır. SQL Server'daki sunucu tarafı kodu, verileri işlemek için harika, ancak CLR kodu kullandığınızda bile genel olarak dosya sistemleriyle ve harici kaynaklarla etkileşimde bulunmak çok zor.

    Bunu SQL Server içinden yapmanın belirli bir nedeni var mı?

  • +0

    Neden daha büyük bir proje için küçük bir demo yapıyorum. Fikir ssms penceresinden her şeyi yapmaktır. Bunun garip bir yaklaşım olduğunu biliyorum ama başka seçeneğim yok. Ayrıca, bazı yönetilmeyen dll'ler yüklendiğinden UNSAFE iznine ihtiyacım var. Yine, bu sadece bir demo, bu yüzden güvenlik konusunda endişelenmiyorum. Visual Studio'dan dll ile hemen hata ayıklayıcısını kullandım ve her şey iyi çalıştı, bu yüzden sorunun dll kodunda olduğunu sanmıyorum. Şansımı yarın prosedürlerle deneyeceğim ama bu muhtemelen uzun bir atış. Cevabınız için çok teşekkür ederim. – Klark

    +0

    Sorumu güncelledim. Lütfen bir göz atın – Klark

    +1

    @Klark Demoyu nasıl çalıştırdığınız hakkında neden başka seçeneğiniz yok?Programınızın çıktısı grafik içeren dosyalar gibi görünüyor, bu yüzden SSMS sadece yanlış bir araçtır. Neden harici bir program yazmıyorsunuz ve demo için bir toplu iş dosyasından başlatmıyorsunuz (bir GUI oluşturmak için zamanınız yoksa)? Yardımcı olmadığım için üzgünüm, ama hiçbir şey yapmadan son derece tuhaf bir şekilde bir şeyler yapıyorsun. – Pondlife

    1

    Dosya sistemine erişmek için SSIS kullanmak daha iyidir. Paketi istediğiniz zaman düzenleyebilir ve test edebilirsiniz, ihtiyaç duyduğunuzda kayıt yapabilirsiniz. Ayrıca, Visual Studio'da GUI'yi bu pakete kolayca ekleyebilirsiniz. DatabaseEngine'den dosya sistemine erişim, güvenlik sorunları nedeniyle en iyi uygulama değildir.

    0

    İlk sorunum, bir UDF'den GUI oluşturabilir miyim?

    oluşturabilir ve/veya görüntüleri manipüle ancak bunlarla System.Drawing kullanabilirsiniz:

    • Kurul UNSAFE bir PERMISSION_SET ve
    • SQL Server içine System.Drawing derleme yükleme sahip olması durumunda, olarak UNSAFE

    İkinci sorun, UNS ile neden bir düzenek olan AFE izni dosya sistemine erişemez. Herhangi bir hata almıyorum, sadece hiçbir şey olmuyor.

    bir düzenek dış kaynaklara erişmek için izin verilir EXTERNAL_ACCESS veya UNSAFE olarak işaretlenmesi. Bunu yapmaya teşebbüs etmek ve bir hata almamak, buna izin verildiğini gösterir. Her ne kadar "hiçbir şey olmuyor" ifadesinin ne anlama geldiği belli değildir, ya da "yutkunma" olan bir catch bloğunuz varsa veya dosya bir mutlak yerine göreceli bir yol kullandığınız için beklemediğiniz bir dizinde oluşturulmuştur. yolu. Dış kaynak erişimi olan

    iki sorun (onlar birbirine bağlanmış olsa da): Windows/Active Directory giriş o erişim için kullanılıyor

    • . Varsayılan olarak, SQLCLR (xp_cmdshell gibi), MSSQLSERVER işlemi için "Log On As" hesabının güvenlik bağlamındaki sisteme erişir. Veya, Oturum Aç (SQL Server'da) bir Windows/Active Directory hesabıyla ilişkili olduğu varsayılarak SQLCLR kodunu yürüten kişinin güvenlik bağlamını üstlenecek olan Kimliğe bürünme özelliğini etkinleştirebilirsiniz. SQL Server girişleri, Kimliğe bürünme özelliğini kullanamaz.

    • Hangi hesabın dış kaynağa eriştiğine bağlı olarak, bu kaynak için izinleri nelerdir? Dosya sistemi ise, bu hesap belirtilen yola yazma erişimi var mı? İlgili R örnek açısından

    (yani C:\test1.jpg oluşturmak) ve bu bürünme kullanılan varsayılarak: mu hesap bu mssqlserver (veya MSSQL $ {ÖrnekAdı}) servis ömrü olarak C: \ için yazma izni var mı? Bu SQL Server örneği bilgisayarınızda çalışmıyorsa, SQL Server'ın çalıştığı sunucunun, C: sürücüsünün sürücü olduğunu unutmayın.