permission_set permission external_access sql sql-server sql-server-2008 sqlclr

sql - permission - ¿Cómo otorgar al propietario de la base de datos(DBO) el permiso EXTERNAL ACCESS ASSEMBLY?



permission_set external_access or unsafe (7)

Cuando trato de crear un ensamblaje en SQL 2008 a partir de un ensamblado .Net (.Net 3.5) Recibo el siguiente error, el error dice que debo establecer cualquiera de las siguientes propiedades como verdaderas, ¿cómo puedo hacer eso?

El propietario de la base de datos (DBO) tiene el permiso EXTERNAL ACCESS ASSEMBLY como TRUE

La base de datos tiene la propiedad de base de datos TRUSTWORTHY en

El ensamblaje se firma con un certificado o una clave asimétrica que tiene un inicio de sesión correspondiente con el permiso EXTERNAL ACCESS ASSEMBLY.

El error completo está abajo,

CREAR ASAMBLEA para el ensamblaje ''SQLLogger'' falló porque el ensamblaje ''SQLLogger'' no está autorizado para PERMISSION_SET = EXTERNAL_ACCESS. El ensamblaje se autoriza cuando se cumple una de las siguientes condiciones: el propietario de la base de datos (DBO) tiene el permiso EXTERNAL ACCESS ASSEMBLY y la base de datos tiene la propiedad TRUSTWORTHY en la base de datos; o el ensamblaje se firma con un certificado o una clave asimétrica que tiene un inicio de sesión correspondiente con el permiso EXTERNAL ACCESS ASSEMBLY.

¡Gracias por adelantado!


¡Debes establecer estas configuraciones en el archivo de proyecto! Cuando haga clic derecho en su proyecto, haga clic en Configuración de la base de datos en la configuración del proyecto y seleccione la pestaña Miscelánea. Deberías ver algo similar a lo que tengo aquí:

Esta es la misma pregunta que: Error al ejecutar CLR Stored Proc


Así es como me las arreglé para hacerlo funcionar:

ALTER DATABASE databasename SET trustworthy ON sp_configure ''show advanced options'', 1; GO RECONFIGURE; GO sp_configure ''clr enabled'', 1; GO RECONFIGURE; GO sp_configure ''show advanced options'', 0; GO RECONFIGURE; GO / DROP ASSEMBLY assemblyname GO CREATE ASSEMBLY assemblyname FROM 0x4D5A9000..... WITH PERMISSION_SET = EXTERNAL_ACCESS


El siguiente código me funcionó para la seguridad integrada:

ALTER DATABASE dtabasename SET TRUSTWORTHY ON; GO ALTER AUTHORIZATION ON DATABASE::dtabasename TO [DOMAIN/UserName] GO


Esta única línea resuelve el problema para mí.

use master; grant external access assembly to [domain/username]


Esto funcionó para mí:

EXEC sp_changedbowner ''sa'' ALTER DATABASE [dbase] SET trustworthy ON

Y también hice esto:

sp_configure ''show advanced options'', 1; GO RECONFIGURE; GO sp_configure ''clr enabled'', 1; GO RECONFIGURE; GO sp_configure ''show advanced options'', 0; GO RECONFIGURE; GO


Esto funciona para:

  • Actualización de Visual Studio 2015 2.
  • Visual Studio 2017.

En la configuración de su proyecto, seleccione "Acceso externo":

En la publicación, el mensaje de error indica que no puede aceptar "EXTERNAL_ACCESS" a menos que el ensamblaje esté configurado como "Confiable".

Por lo tanto, en la configuración del proyecto, configure el ensamblaje como "Confiable":

Esto significó que pude ejecutar una función definida por el usuario de muestra que enumeraba los archivos en el disco duro local .

Si la seguridad sigue siendo demasiado restrictiva, agregue el atributo DataAccess = DataAccessKind.Read a su UDF, por ejemplo:

[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FindFiles", DataAccess = DataAccessKind.Read, TableDefinition = "FileName nvarchar(500), FileSize bigint, CreationTime datetime")]

Actualización 2017-07-02

En SQL Server 2016 + Visual Studio 2015 , es posible que también tenga que hacer lo siguiente:

  • use master;grant unsafe assembly to [Domain/Username];
  • Ejecute cualquier programa (como Visual Studio o cualquier utilidad de C #) en el modo Administrator para otorgarles permisos suficientes para publicar ensamblajes UNSAFE .

Si nada funciona, intente conectarse usando username sa y su contraseña de administrador. Esto siempre funcionará, independientemente de si Visual Studio se ejecuta en modo Administrator o no.


Por favor, no active TRUSTWORTHY ON menos que sea absolutamente necesario. Y solo debe ser "necesario" al cargar una Asamblea que no construyó y no puede volver a firmar. Y eso ocurre principalmente cuando se cargan bibliotecas de .NET Framework que no son "compatibles" y, por lo tanto, no están ya en el servidor CLR de SQL Server. Fuera de esas circunstancias, no debe configurar la base de datos en TRUSTWORTHY ON ya que abre un agujero de seguridad.

En cambio, es mucho mejor hacer lo siguiente:

USE [master]; CREATE ASYMMETRIC KEY [SomeKey] AUTHORIZATION [dbo] FROM EXECUTABLE FILE = ''C:/path/to/Some.dll''; CREATE LOGIN [SomeLogin] FROM ASYMMETRIC KEY [SomeKey]; GRANT EXTERNAL ACCESS ASSEMBLY TO [SomeLogin]; -- or "UNSAFE" instead of "EXTERNAL ACCESS"

Lo anterior solo debe hacerse una vez por instancia, por clave. Entonces, si usa el mismo archivo snk / pfx para todos sus ensamblajes, entonces los pasos que se muestran arriba solo deben realizarse una vez por cada instancia de SQL Server; el número de ensamblajes y bases de datos que contienen esos ensamblajes no importa.

Este enfoque le permite mantener una mejor seguridad en la base de datos (manteniendo TRUSTWORTHY en OFF ) y permite un control más detallado de qué ensamblajes se pueden configurar incluso en EXTERNAL_ACCESS y / o UNSAFE (ya que puede separar usando diferentes teclas para Firma e inicio de sesión basado en esas diferentes claves).

Sin embargo, si debe usar el método TRUSTWORTHY ON , entonces el propietario de la base de datos no necesita ser sa . El requisito es simplemente que al inicio de sesión registrado como propietario de la base de datos se le haya otorgado EXTERNAL ACCESS ASSEMBLY o UNSAFE ASSEMBLY (los mismos dos permisos que se muestran arriba para el inicio de sesión basado en clave asimétrica).

Para una descripción más detallada de las opciones de seguridad, consulte el siguiente artículo que escribí en SQL Server Central: Stairway to SQLCLR Level 4: Security (Ensamblajes EXTERNOS y INSSAFE) (se requiere registro gratuito).

Para obtener información detallada sobre cómo automatizar esto a través de Visual Studio / SSDT, consulte los siguientes 3 artículos (una serie de 3 partes), también en SQL Server Central:

Además, desde que escribí esos 3 artículos, he encontrado un método más sencillo utilizando plantillas T4, pero aún no he tenido tiempo de escribir eso. Cuando lo haga, actualizaré esta respuesta con un enlace a ese artículo.

ACTUALIZAR

SQL Server 2017 introdujo una nueva complicación en forma de una opción de configuración a nivel de servidor llamada "seguridad estricta de CLR". Está habilitado de forma predeterminada y requiere que TODAS las asambleas, incluso aquellas marcadas como SAFE , estén firmadas con un certificado o clave asimétrica, tengan el inicio de sesión asociado, y que el inicio de sesión tenga el permiso UNSAFE ASSEMBLY otorgado (no es lo suficientemente bueno como para otorgar EXTERNAL ACCESS ASSEMBLY ). Consulte mi respuesta a la siguiente pregunta SO para obtener más detalles sobre esta nueva "característica":

Seguridad estricta de CLR en SQL Server 2017