Crear un ensamblado

Los objetos de base de datos administrados, como procedimientos almacenados o desencadenadores, se compilan y, a continuación, se implementan en unidades denominadas ensamblados. Los ensamblados de archivos DLL administrados deben registrarse en Microsoft SQL Server para poder usar la funcionalidad que proporciona el ensamblado. Para registrar un ensamblado en una base de datos de SQL Server, use la instrucción CREATE ASSEMBLY. En este tema se explica cómo registrar un ensamblado en una base de datos mediante la instrucción CREATE ASSEMBLY y cómo especificar la configuración de seguridad del ensamblado.

La instrucción CREATE ASSEMBLY

La instrucción CREATE ASSEMBLY se usa para crear un ensamblado en una base de datos. A continuación se muestra un ejemplo:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'

La cláusula FROM especifica el nombre de ruta de acceso del ensamblado que va a crearse. Esta ruta de acceso puede ser una ruta de acceso UNC (Convención de nomenclatura universal) o una ruta de acceso al archivo físico local en el equipo.

SQL Server no permite registrar distintas versiones de un ensamblado con el mismo nombre, referencia cultural y clave pública.

Es posible crear ensamblados que hagan referencia a otros ensamblados. Cuando se crea un ensamblado en SQL Server, SQL Server también crea los ensamblados a los que hace referencia el ensamblado de nivel raíz, en caso de que aún no se hayan creado en la base de datos.

Se conceden permisos a los usuarios de base de datos o a los roles de usuario para crear y, por tanto, establecerse como propietarios de los ensamblados de una base de datos. Para crear ensamblados, el rol o el usuario de base de datos debe disponer del permiso CREATE ASSEMBLY.

Un ensamblado solo puede hacer referencia correctamente a otros ensamblados si:

  • El ensamblado al que se llama o se hace referencia es propiedad del mismo usuario o del mismo rol.

  • El ensamblado al que se llama o se hace referencia se creó en la misma base de datos.

Especificar la seguridad al crear ensamblados

Al crear un ensamblado en una base de datos de SQL Server, puede especificar uno de los tres niveles distintos de seguridad en los que puede ejecutarse el código: SAFE, EXTERNAL_ACCESS o UNSAFE. Cuando se ejecuta la instrucción CREATE ASSEMBLY, se realizan determinadas comprobaciones en el ensamblado de código que pueden provocar que el ensamblado no se registre en el servidor. Para obtener más información, consulte el ejemplo de suplantación en CodePlex. Vea Ejemplos de motor de base de datos de SQL Server para obtener información adicional.

SAFE es el conjunto de permisos predeterminado y funciona en la mayoría de los escenarios. Para especificar un nivel de seguridad determinado, debe modificar la sintaxis de la instrucción CREATE ASSEMBLY tal y como se indica a continuación:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = SAFE

También es posible crear un ensamblado con el conjunto de permisos SAFE simplemente omitiendo la tercera línea del código anterior:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'

Cuando el código de un ensamblado se ejecuta con el conjunto de permisos SAFE, solo puede realizar tareas de cálculo y acceso a datos en el servidor a través del proveedor administrado en proceso.

Crear ensamblados EXTERNAL_ACCESS y UNSAFE

EXTERNAL_ACCESS se usa en escenarios en los que el código necesita tener acceso a recursos fuera del servidor, como archivos, la red, el Registro y variables de entorno. Cuando el servidor obtiene acceso a un recurso externo, suplanta el contexto de seguridad del usuario que llama al código administrado.

El permiso de código UNSAFE se usa en escenarios en los que no puede comprobarse la seguridad de un ensamblado o el ensamblado requiere acceso adicional a recursos restringidos, como la API Win32 de Microsoft.

Para crear un ensamblado EXTERNAL_ACCESS o UNSAFE en SQL Server, debe cumplirse una de las dos condiciones siguientes:

  1. El ensamblado está firmado con un nombre seguro o firmado mediante Authenticode con un certificado. Este nombre seguro (o certificado) se crea dentro de SQL Server como una clave asimétrica (o certificado) y dispone de un inicio de sesión correspondiente con permiso EXTERNAL ACCESS ASSEMBLY (para ensamblados de acceso externo) o permiso UNSAFE ASSEMBLY (para ensamblados no seguros).

  2. El propietario de la base de datos (DBO) dispone de permiso EXTERNAL ACCESS ASSEMBLY (para los ensamblados EXTERNAL ACCESS) o UNSAFE ASSEMBLY (para los ensamblados UNSAFE), y la Propiedad de base de datos TRUSTWORTHY de base de datos está establecida en ON.

Las dos condiciones indicadas anteriormente también se comprueban en el momento de carga del ensamblado (que incluye la ejecución). Para cargar el ensamblado debe cumplirse al menos una de las condiciones.

Se recomienda que la Propiedad de base de datos TRUSTWORTHY de una base de datos no se establezca en ON solo para ejecutar el código de Common Language Runtime (CLR) en el proceso de servidor. En lugar de ello, es aconsejable crear una clave asimétrica a partir del archivo de ensamblado de la base de datos maestra. A continuación debe crearse un inicio de sesión asignado a esta clave asimétrica y debe concederse el permiso EXTERNAL ACCESS ASSEMBLY o UNSAFE ASSEMBLY al inicio de sesión.

Las siguientes instrucciones Transact-SQL realizan los pasos necesarios para crear una clave asimétrica, asignar un inicio de sesión a esta clave y conceder permiso EXTERNAL_ACCESS al inicio de sesión. Debe ejecutar las siguientes instrucciones Transact-SQL antes de ejecutar la instrucción CREATE ASSEMBLY.

USE master 
GO  
 
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'   
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey   
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin 
GO 

Nota

Debe crear un nuevo inicio de sesión para asociarlo a la clave asimétrica. Este inicio de sesión solamente se usa para conceder permisos; no tiene que asociarse a ningún usuario ni usarse dentro de la aplicación.

Para crear un ensamblado EXTERNAL ACCESS, el creador debe contar con permiso EXTERNAL ACCESS. Este permiso se especifica al crear el ensamblado:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS

Las siguientes instrucciones Transact-SQL realizan los pasos necesarios para crear una clave asimétrica, asignar un inicio de sesión a esta clave y conceder permiso UNSAFE al inicio de sesión. Debe ejecutar las siguientes instrucciones Transact-SQL antes de ejecutar la instrucción CREATE ASSEMBLY.

USE master 
GO  
 
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'   
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey   
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin 
GO

Para especificar que un ensamblado se cargue con el permiso UNSAFE, debe especificar el conjunto de permisos UNSAFE al cargar el ensamblado en el servidor:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE

Para obtener más información sobre los permisos de cada configuración, vea Seguridad de la integración CLR.