2011-04-01 15 views
8

Escribí una UDF simple que debe trazar un gráfico y guardarlo en el disco. En realidad, estoy usando un UDF como proxy entre SQL SERVER y R, por lo que UDF solo pasa el script R al motor R desde SQL SERVER a través de DCOM. Todo funciona bien hasta que intento trazar un gráfico o guardarlo en el disco. Creé la asamblea con permisos SEGUROS.Sql Servidor CLR acceso al sistema de archivos desde UDF

Entonces, dice así: SQL Engine -> UDF -> (D) SERVIDOR COM -> R -> (D) SERVIDOR COM -> UDF -> SQL Engine.

Entonces, mi primer problema es, ¿puedo crear una GUI desde una UDF? Supongo que no, pero vale la pena preguntar.

El segundo problema es por qué un ensamblaje con permiso SEGURO no puede acceder al sistema de archivos. No recibo ningún error, simplemente no pasa nada.

El entorno R se encuentra en el espacio de direcciones diferente, por lo que no veo ningún motivo por el que los permisos de SQL Engine para CLR lo afecten.

Gracias

Editar:

he tratado de hacer lo mismo con los procedimientos. Ahora se crea un archivo vacío. Este es mi código de prueba R:

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

¿Alguna idea de lo que está pasando aquí?

+0

Ejecutaría SysInternals Filemon o Process Monitor e intentaría determinar qué está intentando hacer el conjunto en el sistema de archivos. Puede ganar algo de visibilidad usando una de esas herramientas. –

Respuesta

2
  1. No se puede crear una instancia de una interfaz gráfica de código de servidor
  2. inseguro es peligroso, EXTERNAL_ACCESS sería mejor, ya que todavía permite el acceso de sistema de archivos
  3. Si no hay error, hay una buena probabilidad de que su código se ejecuta correctamente pero está haciendo algo diferente de lo que espera que haga; ¿Puedes agregar algún código de depuración o adjuntar un depurador?
  4. Un procedimiento es más apropiado en este caso de una UDF porque they are much more flexible

Pero no está claro por qué estás haciendo las cosas de esta manera. Probablemente sería mucho más fácil escribir un pequeño programa (?) Fuera de SQL Server para obtener los datos de la base de datos, llamar a su programa R y guardar la imagen. El código del lado del servidor en SQL Server es ideal para el procesamiento de datos, pero es muy incómodo para interactuar con sistemas de archivos y recursos externos en general, incluso cuando se utiliza el código CLR.

¿Hay alguna razón específica por la que necesita hacer esto desde SQL Server?

+0

La razón es que estoy haciendo una pequeña demostración para un proyecto más grande. Idea es hacer todo desde una ventana ssms. Sé que este es un enfoque extraño, pero no tengo otra opción. Además, necesito un permiso SEGURO porque algunos dlls no administrados están cargados. De nuevo, esto es solo una demostración, así que no me preocupo por la seguridad. Usé el depurador inmediato de Visual Studio con el dll y todo funcionó bien, así que no creo que el problema esté en el código dll. Voy a probar suerte con los procedimientos mañana, pero eso es probablemente una posibilidad remota. Muchas gracias por su respuesta. – Klark

+0

Actualicé mi pregunta. Por favor, échele un vistazo – Klark

+1

@Klark ¿Por qué no tiene "otra opción" acerca de cómo ejecuta su demo?La salida de su programa parece ser archivos que contienen gráficos, por lo que SSMS es simplemente la herramienta incorrecta. ¿Por qué no escribir un programa externo y ejecutarlo desde un archivo por lotes para su demostración (si no tiene tiempo para construir una GUI)? Lamento no ser útil, pero estás haciendo las cosas de una manera extremadamente extraña sin ninguna razón obvia. – Pondlife

1

Para acceder al sistema de archivos, es mejor utilizar SSIS. Puede editar y probar el paquete en cualquier momento, realice el registro cuando lo necesite. También puede agregar fácilmente GUI en VisualStudio a este paquete. El acceso al sistema de archivos desde DatabaseEngine no es la mejor práctica debido a posibles problemas de seguridad.

0

mi primer problema es, ¿puedo crear una GUI desde una UDF?

Puede utilizar System.Drawing para crear y/o manipular imágenes, pero:

  • sólo si la Asamblea tiene un PERMISSION_SET de UNSAFE, y
  • se carga el ensamblaje System.Drawing en SQL Server, como se UNSAFE

El segundo problema es, ¿por qué una asamblea con UNS El permiso AFE no puede acceder al sistema de archivos. No recibo ningún error, simplemente no pasa nada.

Un conjunto marcado como EXTERNAL_ACCESS o UNSAFE tiene permiso para acceder a recursos externos. Intentar hacerlo y no recibir un error muestra que está permitido. Aunque no está claro qué significa "nada sucede" significa que o bien tiene un bloque catch que está "tragando" el error, o bien el archivo se creó en un directorio que no esperaba porque utilizó una ruta relativa en lugar de una ruta absoluta camino.

dos cuestiones (a pesar de que están unidas entre sí) con acceso a recursos externos son:

  • Qué Windows/inicio de sesión de Active Directory se utiliza para que el acceso. De forma predeterminada, SQLCLR (al igual que xp_cmdshell) accederá al sistema en el contexto de seguridad de la cuenta "Iniciar sesión como" para el proceso MSSQLSERVER. O bien, tiene la capacidad de habilitar Suplantación que asumirá el contexto de seguridad de quien ejecutó el código SQLCLR, suponiendo que el Inicio de sesión (en SQL Server) está asociado a una cuenta de Windows/Active Directory. Los inicios de sesión de SQL Server no pueden usar suplantación.

  • Según qué cuenta está accediendo al recurso externo, ¿cuáles son sus permisos para ese recurso? Si es el sistema de archivos, ¿esa cuenta tiene acceso de escritura a la ruta especificada?

En términos del ejemplo R dado (es decir, crear C:\test1.jpg), y suponiendo que no está siendo utilizado que Suplantación de identidad: ¿Tiene la cuenta que el MSSQLSERVER (o MSSQL $ {InstanceName}) de ejecución de servicio como tiene permiso de escritura al C: \? Tenga en cuenta que es la unidad C: del servidor donde se está ejecutando SQL Server, no su computadora local, a menos que esta instancia de SQL Server se esté ejecutando en su computadora.

Cuestiones relacionadas