Utilizar ensamblados comprobables con SQL Server (C++/CLI)

Los procedimientos almacenados extendidos, empaquetados como bibliotecas de vínculos dinámicos (DLL), proporcionan una manera de ampliar la funcionalidad de SQL Server a través de funciones desarrolladas con Visual C++. Los procedimientos almacenados extendidos se implementan como funciones dentro de archivos DLL. Además de las funciones, los procedimientos almacenados extendidos también pueden definir tipos definidos por el usuario y funciones de agregado (como SUM o AVG).

Cuando un cliente ejecuta un procedimiento almacenado extendido, SQL Server busca el archivo DLL asociado al procedimiento almacenado extendido y carga el archivo DLL. SQL Server llama al procedimiento almacenado extendido solicitado y lo ejecuta en un contexto de seguridad especificado. A continuación, el procedimiento almacenado extendido pasa los conjuntos de resultados y devuelve los parámetros al servidor.

SQL Server proporciona extensiones a Transact-SQL (T-SQL) para permitirle instalar ensamblados comprobables en SQL Server. El conjunto de permisos de SQL Server especifica el contexto de seguridad, con los siguientes niveles de seguridad:

  • Modo sin restricciones: ejecute el código bajo su propio riesgo; el código no requiere seguridad de tipos comprobable.

  • Modo seguro: ejecute código con seguridad de tipos comprobable; compilado con /clr:safe.

Importante

Visual Studio 2015 está en desuso y Visual Studio 2017 no admite la creación de proyectos comprobables /clr:pure y /clr:safe. Si necesita código comprobable, se recomienda traducir el código a C#.

Para crear y cargar un ensamblado comprobable en SQL Server, use los comandos de Transact-SQL CREATE ASSEMBLY y DROP ASSEMBLY de la siguiente manera:

CREATE ASSEMBLY <assemblyName> FROM <'Assembly UNC Path'> WITH
  PERMISSION_SET <permissions>
DROP ASSEMBLY <assemblyName>

El comando PERMISSION_SET especifica el contexto de seguridad y puede tener los valores UNRESTRICTED, SAFE o EXTENDED.

Además, puede usar el comando CREATE FUNCTION para enlazar con nombres de método en una clase:

CREATE FUNCTION <FunctionName>(<FunctionParams>)
RETURNS returnType
[EXTERNAL NAME <AssemblyName>:<ClassName>::<StaticMethodName>]

Ejemplo

El siguiente script SQL (por ejemplo, denominado "MyScript.sql") carga un ensamblado en SQL Server y hace que un método de una clase esté disponible:

-- Create assembly without external access
drop assembly stockNoEA
go
create assembly stockNoEA
from
'c:\stockNoEA.dll'
with permission_set safe

-- Create function on assembly with no external access
drop function GetQuoteNoEA
go
create function GetQuoteNoEA(@sym nvarchar(10))
returns real
external name stockNoEA:StockQuotes::GetQuote
go

-- To call the function
select dbo.GetQuoteNoEA('MSFT')
go

Los scripts de SQL se pueden ejecutar de forma interactiva en el Analizador de consultas SQL o en la línea de comandos con la utilidad sqlcmd.exe. La siguiente línea de comandos se conecta a MyServer, usa la base de datos predeterminada, usa una conexión de confianza, introduce MyScript.sql y emite MyResult.txt.

sqlcmd -S MyServer -E -i myScript.sql -o myResult.txt

Consulte también

Clases y structs