Published on

November 25, 2011

Escrevendo dados a partir de Funções Definidas pelo Usuário no SQL Server

Ao trabalhar com o SQL Server, você pode se deparar com situações em que precisa escrever dados de dentro de uma função definida pelo usuário. No entanto, o SQL Server não permite o uso de instruções INSERT, UPDATE, DELETE ou MERGE dentro de funções, pois elas são consideradas operações “side-effecting”.

No passado, uma opção para registrar dados de dentro de uma função era usar os procedimentos estendidos sp_OAxxxx. Esses procedimentos permitem que você escreva em um arquivo de depuração, mas eles apresentam problemas de desempenho, pois usam o modelo OLE-Automation para criar objetos COM e chamar seus métodos.

Uma solução muito melhor é desenvolver uma simples UDF (Função Definida pelo Usuário) SQL CLR em C# para escrever dados em um arquivo. Essa abordagem oferece melhor desempenho e flexibilidade. Aqui está um exemplo de como você pode criar uma UDF SQL CLR para escrever em um arquivo:

using System.IO;
using Microsoft.SqlServer.Server;

public class Debug
{
    [SqlFunction]
    public static int ToFile(string fileName, string text)
    {
        return Write(fileName, text);
    }

    private static int Write(string fileName, string line)
    {
        if (File.Exists(fileName))
        {
            using (var sw = File.AppendText(fileName))
            {
                sw.WriteLine(line);
                return 0;
            }
        }
        return -1;
    }
}

Depois de criar a UDF CLR, você precisa registrá-la no SQL Server. Esse processo foi descrito em muitos lugares, então não vou entrar em detalhes aqui. No entanto, é importante observar que, como a função manipula arquivos, algumas alterações de segurança devem ser feitas no seu banco de dados.

Aqui estão as etapas para registrar a UDF CLR no SQL Server:

-- Defina seu banco de dados como confiável devido à necessidade de acesso externo
ALTER DATABASE <seu_banco_de_dados> SET TRUSTWORTHY ON
GO

-- Registre a assembly no SQL Server com permissões de acesso externo
CREATE ASSEMBLY AUTHORIZATION [dbo] FROM WITH PERMISSION_SET = EXTERNAL_ACCESS
GO

-- Crie a encapsulação para a UDF SQL CLR. A função tem a mesma assinatura que sua contraparte em C#.
CREATE FUNCTION fn_ToFile(@fileName [nvarchar](255), @text [nvarchar](4000))
RETURNS INT
WITH EXECUTE AS CALLER
AS
-- Faça referência ao método ToFile em C# da classe Debug
EXTERNAL NAME .Debug.ToFile
GO

-- Este é um exemplo de uma função de lógica de negócios onde você deseja registrar algo
CREATE FUNCTION [fn_SomeBusinessLogicFunction]()
RETURNS INT
WITH EXECUTE AS CALLER
AS
BEGIN
    -- Registre no arquivo
    RETURN dbo.fn_ToFile('seu_caminho_do_arquivo', 'Texto de depuração')
END

Seguindo essas etapas, agora você pode escrever dados de dentro de uma função definida pelo usuário no SQL Server usando uma UDF SQL CLR. Essa abordagem oferece uma solução mais eficiente e flexível em comparação com o uso dos procedimentos estendidos sp_OAxxxx.

Tags: permissões de acesso, AppendText, AUTHORIZATION, automação, CALLER, CLR, CLR UDF, csharpcode, EXECUTE, EXTERNAL, OAxxxx, OLE-Automation, PERMISSION, Registrar assembly, alterações de segurança, SQL, SQL Server, SqlFunction, SqlServer, confiável, udf, writeline

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.