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 MicrosoftSQL 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 las funciones de usuario para crear y, por tanto, establecerse como propietarios de los ensamblados de una base de datos. Para crear ensamblados, la función 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 de la misma función.
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.
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:
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).
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 detalles sobre los permisos de cada configuración, vea Seguridad de la integración CLR.
Historial de cambios
Contenido actualizado |
---|
Se ha agregado una nota sobre la forma de usar el inicio de sesión creado para la clave asimétrica. |