Sql Server CLR доступ к файловой системе из UDF - PullRequest
8 голосов
/ 01 апреля 2011

Я написал простой UDF, который должен построить графику и сохранить ее на диске. На самом деле, я использую UDF в качестве прокси между SQL SERVER и R, поэтому UDF передает R-скрипт в механизм R только из SQL SERVER через DCOM. Все работает нормально, пока я не попытаюсь нарисовать графику или сохранить ее на диск. Я создал сборку с разрешениями UNSAFE.

Итак, это выглядит так: SQL Engine -> UDF -> (D) COM СЕРВЕР -> R -> (D) COM СЕРВЕР -> UDF -> SQL Engine.

Итак, моя первая проблема: могу ли я создать графический интерфейс из UDF? Наверное, нет, но стоит спросить.

Вторая проблема заключается в том, почему сборка с разрешением UNSAFE не может получить доступ к файловой системе. Я не получаю никакой ошибки, просто ничего не происходит.

Среда R находится в другом адресном пространстве, поэтому я не вижу причин, по которым разрешения SQL Engine для CLR могли бы повлиять на нее.

Спасибо

Изменить:

Я пытался сделать то же самое с процедурами. Теперь пустой файл создан. Это мой код теста R:

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

Есть идеи, что здесь происходит?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2011
  1. Вы не можете создать GUI из кода на стороне сервера.
  2. UNSAFE опасен, EXTERNAL_ACCESS будет лучше, так как он по-прежнему разрешает доступ к файловой системе
  3. Если ошибки нет, существуетхороший шанс, что ваш код работает правильно, но он делает что-то отличное от того, что вы ожидаете;Вы можете добавить некоторый код отладки или присоединить отладчик?
  4. Процедура здесь более уместна, чем UDF, потому что они гораздо более гибкие

Но это не такПонятно, почему ты так делаешь.Вероятно, было бы намного проще написать небольшую (?) Программу вне SQL Server, чтобы получить данные из базы данных, вызвать вашу R-программу и сохранить изображение.Серверный код в SQL Server отлично подходит для обработки данных, но очень неудобен для взаимодействия с файловыми системами и внешними ресурсами в целом, даже когда вы используете код CLR.

Есть ли какая-либо конкретная причина, по которой вам нужно это делатьизнутри SQL Server?

1 голос
/ 05 апреля 2011

Для доступа к файловой системе лучше использовать SSIS.Вы можете отредактировать и протестировать пакет в любое время, делая логирование, когда вам нужно.Также вы можете легко добавить графический интерфейс в VisualStudio к этому пакету.Доступ к файловой системе из DatabaseEngine не является лучшей практикой из-за возможных проблем безопасности.

0 голосов
/ 01 февраля 2015

Моя первая проблема: могу ли я создать графический интерфейс из UDF?

Вы можете использовать System.Drawing для создания и / или манипулирования изображениями, но:

  • , только если сборка имеет PERMISSION_SET из UNSAFE и
  • вы загружаете сборку System.Drawing в SQL Server, как UNSAFE

Вторая проблема заключается в том, почему сборка с разрешением UNSAFE не может получить доступ к файловой системе.Я не получаю никакой ошибки, просто ничего не происходит.

Сборке, помеченной как EXTERNAL_ACCESS или UNSAFE, разрешен доступ к внешним ресурсам.Попытка сделать это и отсутствие ошибки показывает, что это разрешено.Хотя неясно, что означает «ничего не происходит», потому что либо у вас есть блок catch, который «глотает» ошибку, либо файл был создан в каталоге, который вы не ожидали, потому что вы использовали относительный путь вместоабсолютный путь.

Две проблемы (хотя они и связаны) с доступом к внешним ресурсам:

  • Какая учетная запись Windows / Active Directory используется для этого доступа.По умолчанию SQLCLR (как и xp_cmdshell) будет обращаться к системе в контексте безопасности учетной записи «Log On As» для процесса MSSQLSERVER .Или у вас есть возможность включить олицетворение, которое будет принимать контекст безопасности того, кто выполнял код SQLCLR, предполагая, что имя входа (в SQL Server) связано с учетной записью Windows / Active Directory.Имена входа SQL Server не могут использовать олицетворение.

  • В зависимости от того, какая учетная запись получает доступ к внешнему ресурсу, каковы их разрешения для этого ресурса?Если это файловая система, имеет ли эта учетная запись доступ для записи по указанному пути?

В терминах приведенного примера R (т. Е. Create C:\test1.jpg) и при условии, что олицетворение не являетсяиспользуется: работает ли учетная запись, что служба MSSQLSERVER (или MSSQL $ {InstanceName} ) имеет разрешение на запись в C: \ ?Помните, что это диск C: сервера, на котором работает SQL Server, а не локального компьютера, если только этот экземпляр SQL Server не запущен на вашем компьютере.

...