Usando assemblies verificáveis com SQL Server (C++/CLI)

Os procedimentos armazenados estendidos, empacotados como DLLs (bibliotecas de vínculo dinâmico) fornecem uma maneira de estender a funcionalidade do SQL Server por meio de funções desenvolvidas com Visual C++. Procedimentos armazenados estendidos são implementados como funções dentro de DLLs. Além das funções, procedimentos armazenados estendidos também podem definir tipos definidos pelo usuário e funções de agregação (como SUM ou AVG).

Quando um cliente executa um procedimento armazenado estendido, o SQL Server pesquisa a DLL associada ao procedimento armazenado estendido e carrega a DLL. O SQL Server chama o procedimento armazenado estendido solicitado e o executa em um contexto de segurança especificado. Em seguida, o procedimento armazenado estendido passa os conjuntos de resultados e retorna os parâmetros de volta ao servidor.

O SQL Server fornece extensões para o Transact-SQL (T-SQL) para permitir instalar assemblies verificáveis no SQL Server. O conjunto de permissões do SQL Server especifica o contexto de segurança, com os seguintes níveis de segurança:

  • Modo irrestrito: executar o código por sua conta e risco; o código não precisa ser verificável como fortemente tipado.

  • Modo de segurança: executar o código verificável como fortemente tipado; compilado com /clr:safe.

Importante

O Visual Studio 2015 foi preterido e o Visual Studio 2017 não dá suporte à criação de /clr:pure e /clr:safe de projetos verificáveis. Se você precisar de código verificável, recomendamos que traduza seu código para C#.

Para criar e carregar um assembly verificável em SQL Server, use os comandos Transact-SQL CREATE ASSEMBLY e DROP ASSEMBLY da seguinte maneira:

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

O comando PERMISSION_SET especifica o contexto de segurança e pode ter os valores UNRESTRICTED, SAFE ou EXTENDED.

Além disso, você pode usar o comando CREATE FUNCTION para associar a nomes de método em uma classe:

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

Exemplo

O script SQL a seguir (por exemplo, chamado "MyScript.sql") carrega um assembly em SQL Server e disponibiliza um método de uma classe:

-- 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

Os scripts SQL podem ser executados interativamente no Analisador de Consulta SQL ou na linha de comando com o utilitário sqlcmd.exe. A linha de comando a seguir se conecta ao MyServer, usa o banco de dados padrão, usa uma conexão confiável, entradas MyScript.sql e saídas MyResult.txt.

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

Confira também

Classes e Structs