Crear un ensamblado

Se aplica a:SQL Server

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 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 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, si los ensamblados a los que se hace referencia aún no se crean 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 diferentes de seguridad en los que se puede ejecutar 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.

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 es para aquellas situaciones en las que un ensamblado no es seguro verificable o requiere acceso adicional a recursos restringidos, como la API de Microsoft Win32.

Para crear un ensamblado EXTERNAL_ACCESS o UNSAFE en SQL Server, se debe cumplir 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 tiene un inicio de sesión correspondiente con el permiso EXTERNAL ACCESS ASSEMBLY (para ensamblados de acceso externo) o el 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 TRUSTWORTHY Database Property 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 TRUSTWORTHY Database Property 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, a continuación, 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, a continuación, 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 CLR Integration Security.

Consulte también

Administrar ensamblados de integración CLR
Modificar un ensamblado
Quitar un ensamblado
Seguridad de acceso del código de integración CLR
Propiedad de base de datos TRUSTWORTHY