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

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

Quando um cliente executa um procedimento armazenado estendido, o SQL Server procura 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 Transact-SQL (T-SQL) para permitir que você instale 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: Execute o código por sua própria conta e risco; o código não precisa ser comprovadamente seguro em termos de tipo.

  • Modo de segurança: Executar código seguro de digitação verificável; compilado com /clr:safe.

Importante

Visual Studio 2015 obsoleto e o Visual Studio 2017 não suporta as opções /clr:pure e /clr:safe na criação de projetos verificáveis. Se você precisar de um código verificável, recomendamos que traduza seu código para C#.

Para criar e carregar um assembly verificável no 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 vincular a nomes de método em uma classe:

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

Exemplo

O seguinte script SQL (por exemplo, chamado "MyScript.sql") carrega um assembly no 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 SQL Query Analyzer ou na linha de comando com o utilitário sqlcmd.exe. A seguinte linha de comando conecta-se ao MyServer, utiliza a base de dados padrão, usa uma ligação confiável, executa o MyScript.sql e produz MyResult.txt.

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

Ver também

Classes e Estruturas