CREATE ASSEMBLY (Transact-SQL)CREATE ASSEMBLY (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database (solo Instancia administrada) noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database (Managed Instance only) noAzure SQL Data Warehouse noParallel Data Warehouse

Crea un módulo de aplicación administrada que contiene metadatos de clase y código administrado como un objeto en una instancia de SQL ServerSQL Server.Creates a managed application module that contains class metadata and managed code as an object in an instance of SQL ServerSQL Server. Mediante este módulo, puede crear en la base de datos funciones CLR (Common Language Runtime), procedimientos almacenados, desencadenadores, funciones de agregado definidas por el usuario y tipos definidos por el usuario.By referencing this module, common language runtime (CLR) functions, stored procedures, triggers, user-defined aggregates, and user-defined types can be created in the database.

Advertencia

CLR usa la seguridad de acceso del código (CAS) de .NET Framework, que ya no se admite como un límite de seguridad.CLR uses Code Access Security (CAS) in the .NET Framework, which is no longer supported as a security boundary. Un ensamblado CLR creado con la opción PERMISSION_SET = SAFE puede tener acceso a los recursos externos del sistema, llamar a código no administrado y adquirir privilegios sysadmin.A CLR assembly created with PERMISSION_SET = SAFE may be able to access external system resources, call unmanaged code, and acquire sysadmin privileges. A partir de SQL Server 2017 (14.x)SQL Server 2017 (14.x), se incluye una opción de sp_configure denominada clr strict security para mejorar la seguridad de los ensamblados CLR.Beginning with SQL Server 2017 (14.x)SQL Server 2017 (14.x), an sp_configure option called clr strict security is introduced to enhance the security of CLR assemblies. La opción clr strict security está habilitada de forma predeterminada y trata los ensamblados SAFE y EXTERNAL_ACCESS como si estuvieran marcados con UNSAFE.clr strict security is enabled by default, and treats SAFE and EXTERNAL_ACCESS assemblies as if they were marked UNSAFE. La opción clr strict security se puede deshabilitar para permitir la compatibilidad con versiones anteriores, pero no se recomienda hacerlo.The clr strict security option can be disabled for backward compatibility, but this is not recommended. Microsoft recomienda que todos los ensamblados estén firmados con un certificado o clave asimétrica con el correspondiente inicio de sesión que tenga concedido el permiso UNSAFE ASSEMBLY en la base de datos maestra.Microsoft recommends that all assemblies be signed by a certificate or asymmetric key with a corresponding login that has been granted UNSAFE ASSEMBLY permission in the master database. Para obtener más información, vea CLR strict security.For more information, see CLR strict security.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

CREATE ASSEMBLY assembly_name  
[ AUTHORIZATION owner_name ]  
FROM { <client_assembly_specifier> | <assembly_bits> [ ,...n ] }  
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]  
[ ; ]  
<client_assembly_specifier> :: =  
        '[\\computer_name\]share_name\[path\]manifest_file_name'  
  | '[local_path\]manifest_file_name'  
  
<assembly_bits> :: =  
{ varbinary_literal | varbinary_expression }  

ArgumentosArguments

assembly_nameassembly_name
Es el nombre del ensamblado.Is the name of the assembly. El nombre debe ser único en la base de datos y un identificador válido.The name must be unique within the database and a valid identifier.

AUTHORIZATION owner_nameAUTHORIZATION owner_name
Especifica el nombre de un usuario o rol como propietario del ensamblado.Specifies the name of a user or role as owner of the assembly. owner_name debe ser el nombre de un rol del que el usuario actual sea miembro, o bien el usuario actual debe tener el permiso IMPERSONATE sobre owner_name.owner_name must either be the name of a role of which the current user is a member, or the current user must have IMPERSONATE permission on owner_name. Si no se especifica, la propiedad se otorga al usuario actual.If not specified, ownership is given to the current user.

<especificador_de_ensamblado_de_cliente><client_assembly_specifier>
Especifica la ruta de acceso local o ubicación de red en la que se encuentra el ensamblado que se carga y, además, el nombre de archivo de manifiesto que se corresponde con el ensamblado.Specifies the local path or network location where the assembly that is being uploaded is located, and also the manifest file name that corresponds to the assembly. <especificador_de_ensamblado_de_cliente> se puede expresar como una cadena fija o una expresión que se evalúe como una cadena fija, con variables.<client_assembly_specifier> can be expressed as a fixed string or an expression evaluating to a fixed string, with variables. CREATE ASSEMBLY no admite la carga de ensamblados de varios módulos.CREATE ASSEMBLY does not support loading multimodule assemblies. SQL ServerSQL Server también busca cualquier ensamblado dependiente de este ensamblado en la misma ubicación y lo carga con el mismo propietario que el ensamblado de nivel raíz.also looks for any dependent assemblies of this assembly in the same location and also uploads them with the same owner as the root level assembly. Si estos ensamblados dependientes no se encuentran o aún no están cargados en la base de datos actual, CREATE ASSEMBLY produce un error.If these dependent assemblies are not found and they are not already loaded in the current database, CREATE ASSEMBLY fails. Si los ensamblados dependientes ya están cargados en la base de datos actual, el propietario de los mismos deberá ser el mismo que el del ensamblado nuevo que se crea.If the dependent assemblies are already loaded in the current database, the owner of those assemblies must be the same as the owner of the newly created assembly.

Importante

Azure SQL Database no admite la creación de un ensamblado desde un archivo.Azure SQL Database does not support creating an assembly from a file.

No se puede especificar <especificador_de_ensamblado_de_cliente> si el usuario que ha iniciado sesión es suplantado.<client_assembly_specifier> cannot be specified if the logged in user is being impersonated.

<bits_de_ensamblado><assembly_bits>
Es la lista de valores binarios que forman el ensamblado y sus ensamblados dependientes.Is the list of binary values that make up the assembly and its dependent assemblies. El primer valor de esta lista se considera el ensamblado raíz.The first value in the list is considered the root-level assembly. Los valores correspondientes a los ensamblados dependientes pueden suministrarse en cualquier orden.The values corresponding to the dependent assemblies can be supplied in any order. Se ignora cualquier valor que no se corresponda con los ensamblados dependientes del ensamblado raíz.Any values that do not correspond to dependencies of the root assembly are ignored.

Nota

Esta opción no está disponible en las bases de datos independientes.This option is not available in a contained database.

varbinary_literalvarbinary_literal
Es un literal varbinary.Is a varbinary literal.

expresión_varbinaryvarbinary_expression
Es una expresión de tipo varbinary.Is an expression of type varbinary.

PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }

Importante

La opción PERMISSION_SET se ve afectada por la opción clr strict security, descrita en la advertencia inicial.The PERMISSION_SET option is affected by the clr strict security option, described in the opening warning. Cuando clr strict security está habilitada, todos los ensamblados se tratan como UNSAFE.When clr strict security is enabled, all assemblies are treated as UNSAFE.

Especifica un conjunto de permisos de acceso a código que se conceden al ensamblado cuando SQL ServerSQL Server tiene acceso al mismo.Specifies a set of code access permissions that are granted to the assembly when it is accessed by SQL ServerSQL Server. Si no se especifica, el valor SAFE se aplica de forma predeterminada.If not specified, SAFE is applied as the default.

Es recomendable el uso de SAFE.We recommend using SAFE. SAFE es el conjunto de permisos más restrictivo.SAFE is the most restrictive permission set. El código que ejecuta un ensamblado con permisos SAFE no puede tener acceso a recursos externos del sistema, como archivos, la red, variables de entorno o el registro.Code executed by an assembly with SAFE permissions cannot access external system resources such as files, the network, environment variables, or the registry.

EXTERNAL_ACCESS habilita que los ensamblados tengan acceso a determinados recursos externos del sistema, como archivos, redes, variables de entorno y el Registro.EXTERNAL_ACCESS enables assemblies to access certain external system resources such as files, networks, environmental variables, and the registry.

Nota

Esta opción no está disponible en las bases de datos independientes.This option is not available in a contained database.

UNSAFE habilita que los ensamblados tengan acceso ilimitado a los recursos, tanto dentro como fuera de una instancia de SQL ServerSQL Server.UNSAFE enables assemblies unrestricted access to resources, both within and outside an instance of SQL ServerSQL Server. El código que se ejecuta desde dentro de un ensamblado UNSAFE puede llamarse código no administrado.Code running from within an UNSAFE assembly can call unmanaged code.

Nota

Esta opción no está disponible en las bases de datos independientes.This option is not available in a contained database.

Importante

SAFE es el ajuste de permiso recomendado para ensamblados que realizan tareas de administración de datos y cálculos sin tener acceso a los recursos fuera de una instancia de SQL ServerSQL Server.SAFE is the recommended permission setting for assemblies that perform computation and data management tasks without accessing resources outside an instance of SQL ServerSQL Server.

Es recomendable el uso de EXTERNAL_ACCESS para ensamblados que tengan acceso a recursos fuera de una instancia de SQL ServerSQL Server.We recommend using EXTERNAL_ACCESS for assemblies that access resources outside of an instance of SQL ServerSQL Server. Los ensamblados EXTERNAL_ACCESS incluyen la protección de escalabilidad y confiabilidad ofrecida por los ensamblados SAFE; sin embargo, desde el punto de vista de la seguridad, son similares a los ensamblados UNSAFE.EXTERNAL_ACCESS assemblies include the reliability and scalability protections of SAFE assemblies, but from a security perspective are similar to UNSAFE assemblies. Esto se debe a que el código en los ensamblados EXTERNAL_ACCESS se ejecuta de forma predeterminada con la cuenta del servicio SQL ServerSQL Server y tiene acceso a los recursos externos con esa misma cuenta, a no ser que el código suplante al autor de la llamada de forma explícita.This is because code in EXTERNAL_ACCESS assemblies runs by default under the SQL ServerSQL Server service account and accesses external resources under that account, unless the code explicitly impersonates the caller. Por esta razón, el permiso para crear ensamblados EXTERNAL_ACCESS solo debe concederse a los inicios de sesión en los que se confíe para ejecutar código con la cuenta del servicio SQL ServerSQL Server.Therefore, permission to create EXTERNAL_ACCESS assemblies should be granted only to logins that are trusted to run code under the SQL ServerSQL Server service account. Para obtener más información sobre la suplantación, vea Seguridad de la integración CLR.For more information about impersonation, see CLR Integration Security.

Si especifica UNSAFE, otorga libertad absoluta al código en el ensamblado para realizar operaciones en el espacio de procesos de SQL ServerSQL Server que pueden comprometer la solidez de SQL ServerSQL Server.Specifying UNSAFE enables the code in the assembly complete freedom to perform operations in the SQL ServerSQL Server process space that can potentially compromise the robustness of SQL ServerSQL Server. Los ensamblados UNSAFE también pueden trastornar potencialmente el sistema de seguridad de SQL ServerSQL Server o de Common Language Runtime.UNSAFE assemblies can also potentially subvert the security system of either SQL ServerSQL Server or the common language runtime. Los permisos UNSAFE solo deben otorgarse a los ensamblados de gran confianza.UNSAFE permissions should be granted only to highly trusted assemblies. Solo los miembros del rol fijo de servidor sysadmin pueden crear y modificar los ensamblados UNSAFE.Only members of the sysadmin fixed server role can create and alter UNSAFE assemblies.

Para obtener más información sobre los conjuntos de permisos de ensamblado, vea Diseño de ensamblados.For more information about assembly permission sets, see Designing Assemblies.

NotasRemarks

CREATE ASSEMBLY carga un ensamblado que ha sido compilado anteriormente como un archivo .dll desde código administrado para su uso dentro de una instancia de SQL Server.CREATE ASSEMBLY uploads an assembly that was previously compiled as a .dll file from managed code for use inside an instance of SQL Server.

Cuando se habilita, la opción PERMISSION_SET en las instrucciones CREATE ASSEMBLY y ALTER ASSEMBLY se omite en tiempo de ejecución, pero las opciones PERMISSION_SET se conservan en los metadatos.When enabled, the PERMISSION_SET option in the CREATE ASSEMBLY and ALTER ASSEMBLY statements is ignored at run-time, but the PERMISSION_SET options are preserved in metadata. Si la opción se omite, se reduce el riesgo de romper las instrucciones de código existentes.Ignoring the option, minimizes breaking existing code statements.

SQL ServerSQL Server no permite registrar distintas versiones de un ensamblado con el mismo nombre, referencia cultural y clave pública.does not allow registering different versions of an assembly with the same name, culture and public key.

Cuando se intenta obtener acceso al ensamblado especificado en <especificador_de_ensamblado_de_cliente>, SQL ServerSQL Server suplanta el contexto de seguridad del inicio de sesión de Windows actual.When attempting to access the assembly specified in <client_assembly_specifier>, SQL ServerSQL Server impersonates the security context of the current Windows login. Si <especificador_de_ensamblado_de_cliente> especifica una ubicación de red (ruta de acceso UNC), la suplantación del inicio de sesión actual no se mantiene en la ubicación de red debido a las limitaciones de delegación.If <client_assembly_specifier> specifies a network location (UNC path), the impersonation of the current login is not carried forward to the network location because of delegation limitations. En este caso, el acceso se realiza mediante el contexto de seguridad de la cuenta del servicio SQL ServerSQL Server.In this case, access is made using the security context of the SQL ServerSQL Server service account. Para más información, vea Credenciales (motor de base de datos).For more information, see Credentials (Database Engine).

Además del ensamblado raíz especificado por assembly_name, SQL ServerSQL Server intenta cargar cualquier ensamblado al que haga referencia el ensamblado raíz que se carga.Besides the root assembly specified by assembly_name, SQL ServerSQL Server tries to upload any assemblies that are referenced by the root assembly being uploaded. Si ya se ha cargado en la base de datos un ensamblado referenciado por la existencia de una instrucción CREATE ASSEMBLY anterior, este ensamblado no se carga, sino que está disponible para el ensamblado raíz.If a referenced assembly is already uploaded to the database because of an earlier CREATE ASSEMBLY statement, this assembly is not uploaded but is available to the root assembly. Si no se ha cargado antes un ensamblado dependiente, pero SQL ServerSQL Server no puede localizar el archivo de manifiesto en el directorio de origen, CREATE ASSEMBLY produce un error.If a dependent assembly was not previously uploaded, but SQL ServerSQL Server cannot locate its manifest file in the source directory, CREATE ASSEMBLY returns an error.

Si un ensamblado dependiente referenciado por el ensamblado raíz no está aún en la base de datos y se ha cargado implícitamente junto con el ensamblado raíz, este ensamblado tiene establecidos los mismos permisos que el ensamblado raíz.If any dependent assemblies referenced by the root assembly are not already in the database and are implicitly loaded together with the root assembly, they have the same permission set as the root level assembly. Si se deben crear ensamblados dependientes mediante el uso de permisos diferentes de los del ensamblado raíz, estos deben cargarse explícitamente antes del ensamblado raíz con los permisos apropiados establecidos.If the dependent assemblies must be created by using a different permission set than the root-level assembly, they must be uploaded explicitly before the root level assembly with the appropriate permission set.

Validación del ensambladoAssembly Validation

SQL ServerSQL Server realiza comprobaciones en los binarios del ensamblado cargados mediante la instrucción CREATE ASSEMBLY para garantizar que lo siguiente se cumple:performs checks on the assembly binaries uploaded by the CREATE ASSEMBLY statement to guarantee the following:

  • El binario del ensamblado está formado por metadatos y segmentos de código válidos; los segmentos de código tienen instrucciones MSIL (Lenguaje intermedio de Microsoft) válidas.The assembly binary is well formed with valid metadata and code segments, and the code segments have valid Microsoft Intermediate language (MSIL) instructions.

  • El conjunto de ensamblados del sistema al que hace referencia es uno de los siguientes ensamblados admitidos en SQL ServerSQL Server: Microsoft.Visualbasic.dll, Mscorlib.dll, System.Data.dll, System.dll, System.Xml.dll, Microsoft.Visualc.dll, Custommarshallers.dll, System.Security.dll, System.Web.Services.dll, System.Data.SqlXml.dll, System.Core.dll y System.Xml.Linq.dll.The set of system assemblies it references is one of the following supported assemblies in SQL ServerSQL Server: Microsoft.Visualbasic.dll, Mscorlib.dll, System.Data.dll, System.dll, System.Xml.dll, Microsoft.Visualc.dll, Custommarshallers.dll, System.Security.dll, System.Web.Services.dll, System.Data.SqlXml.dll, System.Core.dll, and System.Xml.Linq.dll. Se puede hacer referencia a otros ensamblados del sistema, pero deben estar registrados de forma explícita en la base de datos.Other system assemblies can be referenced, but they must be explicitly registered in the database.

  • Para ensamblados creados mediante los conjuntos de permisos SAFE o EXTERNAL ACCESS:For assemblies created by using SAFE or EXTERNAL ACCESS permission sets:

    • El código del ensamblado debe tener seguridad de tipos.The assembly code should be type-safe. La seguridad de tipos se establece ejecutando el comprobador de Common Language Runtime en el ensamblado.Type safety is established by running the common language runtime verifier against the assembly.

    • El ensamblado no debe contener ningún miembro de datos estáticos en sus clases, a menos que esté marcado como de solo lectura.The assembly should not contain any static data members in its classes unless they are marked as read-only.

    • Las clases en el ensamblado no pueden contener métodos de finalizador.The classes in the assembly cannot contain finalizer methods.

    • Las clases o métodos del ensamblado deben anotarse solamente con atributos de código permitidos.The classes or methods of the assembly should be annotated only with allowed code attributes. Para obtener más información, vea Atributos personalizados para las rutinas CLR.For more information, see Custom Attributes for CLR Routines.

Además de las comprobaciones previas realizadas al ejecutar CREATE ASSEMBLY, existen comprobaciones adicionales que se realizan en el tiempo de ejecución del código en el ensamblado:Besides the previous checks that are performed when CREATE ASSEMBLY executes, there are additional checks that are performed at execution time of the code in the assembly:

  • Se puede producir un error en la llamada a determinadas API de MicrosoftMicrosoft.NET Framework.NET Framework que requieren un permiso de acceso a código específico si el conjunto de permisos del ensamblado no incluye ese permiso.Calling certain MicrosoftMicrosoft.NET Framework.NET Framework APIs that require a specific Code Access Permission may fail if the permission set of the assembly does not include that permission.

  • En el caso de ensamblados SAFE y EXTERNAL_ACCESS, cualquier intento de llamada a las API .NET Framework.NET Framework anotadas con HostProtectionAttributes dará error.For SAFE and EXTERNAL_ACCESS assemblies, any attempt to call .NET Framework.NET Framework APIs that are annotated with certain HostProtectionAttributes will fail.

Para obtener más información, vea Diseño de ensamblados.For more information, see Designing Assemblies.

PermisosPermissions

Requiere el permiso CREATE ASSEMBLY.Requires CREATE ASSEMBLY permission.

Si se especifica PERMISSION_SET = EXTERNAL_ACCESS, se requiere el permiso EXTERNAL ACCESS ASSEMBLY en el servidor.If PERMISSION_SET = EXTERNAL_ACCESS is specified, requiresEXTERNAL ACCESS ASSEMBLY permission on the server. Si se especifica PERMISSION_SET = UNSAFE, se requiere el permiso UNSAFE ASSEMBLY en el servidor.If PERMISSION_SET = UNSAFE is specified, requires UNSAFE ASSEMBLY permission on the server.

El usuario debe ser el propietario de cualquier ensamblado al que el ensamblado que se va a cargar haga referencia (si los ensamblados ya existen en la base de datos).User must be the owner of any assemblies that are referenced by the assembly that are to be uploaded if the assemblies already exist in the database. Para cargar un ensamblado mediante una ruta de acceso de archivo, el usuario actual debe ser miembro del inicio de sesión autenticado de Windows o del rol fijo de servidor sysadmin.To upload an assembly by using a file path, the current user must be a Windows authenticated login or a member of the sysadmin fixed server role. El inicio de sesión de Windows del usuario que ejecuta CREATE ASSEMBLY debe tener permisos de lectura en el recurso compartido y en los archivos que se cargan por medio de la instrucción.The Windows login of the user that executes CREATE ASSEMBLY must have read permission on the share and the files being loaded in the statement.

Permisos con seguridad estricta de CLRPermissions with CLR strict security

Los siguientes permisos son necesarios para crear un ensamblado CLR cuando la opción CLR strict security está habilitada:The following permissions required to create a CLR assembly when CLR strict security is enabled:

  • El usuario debe tener el permiso CREATE ASSEMBLY.The user must have the CREATE ASSEMBLY permission
  • Además, se debe dar una de las siguientes condiciones:And one of the following conditions must also be true:
    • El ensamblado debe estar firmado con un certificado o clave asimétrica que tenga el inicio de sesión correspondiente con el permiso UNSAFE ASSEMBLY en el servidor.The assembly is signed with a certificate or asymmetric key that has a corresponding login with the UNSAFE ASSEMBLY permission on the server. Se recomienda firmar el ensamblado.Signing the assembly is recommended.
    • La base de datos tiene la propiedad TRUSTWORTHY establecida en ON y pertenece a un inicio de sesión que tiene el permiso UNSAFE ASSEMBLY en el servidor.The database has the TRUSTWORTHY property set to ON, and the database is owned by a login that has the UNSAFE ASSEMBLY permission on the server. Esta opción no se recomienda.This option is not recommended.

Para obtener más información sobre los conjuntos de permisos de ensamblado, vea Diseño de ensamblados.For more information about assembly permission sets, see Designing Assemblies.

EjemplosExamples

Ejemplo A: Creación de un ensamblado desde un archivo DLLExample A: Creating an assembly from a dll

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

En el ejemplo siguiente se asume que los ejemplos del Motor de base de datos de SQL ServerSQL Server Database Engine se han instalado en la ubicación predeterminada del equipo local y que la aplicación de ejemplo HelloWorld.csproj se ha compilado.The following example assumes that the Motor de base de datos de SQL ServerSQL Server Database Engine samples are installed in the default location of the local computer and the HelloWorld.csproj sample application is compiled. Para más información, vea Ejemplo de Hola a todos.For more information, see Hello World Sample.

CREATE ASSEMBLY HelloWorld   
FROM <system_drive>:\Program Files\Microsoft SQL Server\100\Samples\HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll  
WITH PERMISSION_SET = SAFE;  

Importante

Azure SQL Database no admite la creación de un ensamblado desde un archivo.Azure SQL Database does not support creating an assembly from a file.

Ejemplo B: Creación de un ensamblado desde bits de ensambladoExample B: Creating an assembly from assembly bits

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Reemplace los bits de ejemplo (que no son completos o válidos) con sus bits de ensamblado.Replace the sample bits (which are not complete or valid) with your assembly bits.

CREATE ASSEMBLY HelloWorld  
    FROM 0x4D5A900000000000  
WITH PERMISSION_SET = SAFE;  

Consulte tambiénSee Also

ALTER ASSEMBLY (Transact-SQL) ALTER ASSEMBLY (Transact-SQL)
DROP ASSEMBLY (Transact-SQL) DROP ASSEMBLY (Transact-SQL)
CREATE FUNCTION (Transact-SQL) CREATE FUNCTION (Transact-SQL)
CREATE PROCEDURE (Transact-SQL) CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
CREATE TYPE (Transact-SQL) CREATE TYPE (Transact-SQL)
CREATE AGGREGATE (Transact-SQL) CREATE AGGREGATE (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
Escenarios de uso y ejemplos para la integración de Common Language Runtime (CLR)Usage Scenarios and Examples for Common Language Runtime (CLR) Integration