AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 252077
Accepted
Doug Coats
Doug Coats
Asked: 2019-10-29 06:06:06 +0800 CST2019-10-29 06:06:06 +0800 CST 2019-10-29 06:06:06 +0800 CST

System.Web na função CLR do SQL Server

  • 772

Eu fiz uma pesquisa leve sobre esse tópico e gostaria de saber quais são todos os prós e contras ou habilitar/registrar esse .dll específico no SQL Server?

Voltar informações - estamos integrando com um aplicativo de terceiros (não minha decisão, infelizmente) que requer este .dll para alguns outros .dlls. O que eu preciso da função CLR é poder escrever consultas SQL no SSMS e enviar esses dados para a API do aplicativo de terceiros que, por sua vez, faria o carregamento/alterações de dados corretos (inserções e exclusões de/para este aplicativo têm a ser feito através de sua API).

EDIT - talvez eu devesse ter incluído esse detalhe

Ao tentar registrar minha classe c#, obviamente recebi o erro "system.web não registrado blah blah blah" que, por sua vez, levou minha pesquisa sobre esse tópico.

terminar edição

Então, meu enigma é que para poder registrar minha classe C#/.dll, eu tenho que registrar todos os .dll's dependentes, no entanto, com base em minha pesquisa, sei que esse em particular pode ser bastante problemático.

Então, vendo como eu não estou muito familiarizado com as armadilhas fora da minha pesquisa no Google, eu queria saber se um de vocês pode me ajudar a entender como tomar a melhor decisão em relação a isso.

Além disso, o que mais posso adicionar a este post para que seja mais fácil fornecer insights? Eu não tinha certeza de que o código C# era relevante? Eu entendo que isso pode ser um pouco amplo, mas eu esperava que fosse específico o suficiente para não ser sinalizado?

Para ser mais específico sobre o que está ocorrendo aqui (por solicitação de Salomão)

  1. O aplicativo de terceiros usa uma "API" (usada vagamente porque me disseram que não é uma ótima API) para enviar dados de um lado para o outro. Você notará que ele chama uma função Importer que recebe apenas uma tabela de dados ou um arquivo do Excel que converte. Não tenho outra opção, pois a empresa me disse que inserções e exclusões via XML normal são terrivelmente lentas e têm um comportamento inesperado.

  2. A .DLL que faz referência a System.Web é referenciada em minha classe C#, que é necessária para poder enviar dados em primeiro lugar.

  3. Em relação a:

    Por que você não seria capaz de usar os métodos que mencionei? Eles já existem no host CLR do SQL Server. Isso é para um serviço da web, certo

Não tenho certeza se sei o suficiente sobre APIs em geral para responder a isso. Eu poderia e só falta o conhecimento e experiência para fazê-lo. Também pode ser devido ao fato de eu ter limitações sobre como posso interagir com essa API específica e não tenho certeza de como essas limitações se aplicam a esses métodos. (Vou investigar mais e ver se posso responder a esta pergunta eu mesmo).

Embora quanto mais eu penso sobre isso, eu poderia criar uma classe "intermediário" que o SQL Server pode chamar, que então chamaria outra classe, que teria todas as referências corretas e isso poderia me fazer passar pela minha situação atual. Eu ainda, no entanto, estou interessado no feedback específico para que eu possa aprender com isso.

aqui está minha classe c#:

    using Perfion.Api;   -- this .DLL references System.Web. 
    using Perfion.Api.Import;
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;

    namespace PerfInsert
    {
        public static class PerfionInsert 
        {
            public static bool CreateCommand(string tblString, string featureName, string connectionString, string perfionConnectionString, string logFile)
            {
                StringBuilder logInfo = new StringBuilder();
                try
                {
                    var wList = new Regex(@"[^0-9a-z\.\[\]_]#", RegexOptions.IgnoreCase);
                    if (wList.IsMatch(tblString))
                    {
                        logInfo.AppendLine($"{DateTime.UtcNow} - Regex Validation Failed for Table Name!");
                        return false;
                    }
                    using (SqlConnection connection = new SqlConnection(connectionString))
                    {
                        var qryString = "SELECT * FROM " + tblString;
                        using (SqlCommand command = new SqlCommand(qryString, connection))
                        {
                            connection.Open();
                            using (var dataReader = command.ExecuteReader())
                            using (var dataTable = new DataTable())
                            {
                                dataTable.Load(dataReader);
                                PerfionApi api = new PerfionApi(perfionConnectionString);
                                Importer importer = new Importer(api.Connection);
                                importer.Status += (sender, e) => { logInfo.AppendLine($"{DateTime.UtcNow} - {e.Title}"); };
                                importer.LoadData(dataTable);
                                importer.ImportToDatabase(featureName);
                            }
                        }
                    }
                    return true;
                }
                catch (Exception ex)
                {
                    logInfo.AppendLine($"{DateTime.UtcNow} - {ex.ToString()}");
                }
                finally
                {
                    File.AppendAllText(logFile, logInfo.ToString());
                }
                return false;
            }
        }
    }
sql-server c#
  • 1 1 respostas
  • 444 Views

1 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2019-10-29T06:37:42+08:002019-10-29T06:37:42+08:00

    Que o software de terceiros requer a DLL não parece relevante aqui. Parece que a questão é simplesmente:

    Eu preciso ... ser capaz de escrever consultas SQL no SSMS e enviar esses dados para a API do aplicativo de terceiros, que, por sua vez, faria o carregamento/alterações de dados corretos (inserções e exclusões de/para este aplicativo devem ser feito através de sua API).

    Acredito que suas duas melhores opções são:

    1. Se esse processo é tão simples quanto você declarou, e você realmente deseja continuar com System.Web, por que não criar um aplicativo de console que faça a consulta e depois publique o que você precisar na API? Se isso precisar ser feito regularmente, ele pode ser agendado no Agendador de Tarefas do Windows ou no SQL Server Agent (por meio de uma etapa de trabalho "Sistema operacional (CmdExec)").

    2. Se esse processo for um pouco mais complexo e/ou você precisar da capacidade de fazer essas consultas de maneira mais dinâmica/ad hoc, System.Webnão será necessário , apenas facilitará parte da codificação. Em vez disso, examine HttpWebRequest e HttpWebResponse . Esses dois estão incluídos no System.Net, que é uma das bibliotecas do .NET Framework com suporte para SQLCLR. A principal diferença é que você precisará construir a solicitação XML manualmente. O mesmo vale para lidar com a resposta. Essa abordagem é mais estável e segura do que importar System.Web.

      Nessa linha, para quem precisa dessa funcionalidade, mas não quer (ou pode) fazer a codificação dela, escrevi uma biblioteca de funções e procedimentos SQLCLR — SQL# — que inclui um procedimento armazenado, INET_GetWebPages , que implementa esses dois métodos. Embora exista uma versão gratuita, esse procedimento armazenado específico só está disponível na versão completa (ou seja, paga). No entanto, ele lida com uma variedade de opções/cenários, incluindo: configuração de vários cabeçalhos HTTP, autenticação básica opcional, servidor proxy, envio de dados GET vs POST, tratamento de solicitações PUT e opções para reduzir o impacto negativo potencial no desempenho.

    SE você está dizendo que está usando a DLL do aplicativo de terceiros para fazer as chamadas de API por meio de seus métodos fornecidos, e é a DLL que faz referência e usa System.Web(e não seu código diretamente), então é difícil dizer com total certeza o que todos os impactos são. Mas aqui estão algumas coisas a considerar em relação a essa abordagem:

    System.Webnão está na lista de Bibliotecas do .NET Framework com suporte para SQLCLR. Isso significa, no mínimo:

    1. Esta biblioteca não tem garantia de ser carregável no SQL Server. Mesmo que ele possa ser carregado atualmente, o SQL Server permite apenas bibliotecas MSIL puras e não carregará bibliotecas de modo misto (ou seja, DLLs com código gerenciado e não gerenciado). Não há como contornar essa restrição. Como essa biblioteca não está na lista, ela pode mudar de pura para mista em uma atualização futura do .NET Framework. Se isso acontecer, esse código parará de funcionar, pois esta é uma biblioteca do Framework e é carregada no GAC, e as bibliotecas carregadas no SQL Server e no GAC devem ser exatamente da mesma versão (portanto, você não pode continuar usando a versão mais antiga e funcional) . Essa mudança de puro para misto não acontece com frequência, mas já aconteceu antes.
    2. Esta biblioteca precisa ser carregada como UNSAFE. Isso não é inerentemente um problema, mas permite um comportamento que pode facilmente ser um problema. Por exemplo, se qualquer um dos caminhos de código usados ​​por essa DLL de terceiros usar uma variável estática para armazenar informações em cache, se esse valor não for padrão (ou seja, ele pode mudar entre, ou mesmo durante, chamadas para esse código), então você pode entrar em uma condição de corrida, pois o SQL Server usa um domínio de aplicativo compartilhado e todas as sessões compartilham a mesma memória/dados estáticos.

    Há algum código que precisa ser carregado UNSAFEsimplesmente por não estar na lista "Suportado" e contém algo que viola a política de segurança, mesmo que você nunca use esse caminho de código específico. Nesses casos, o código pode ser tecnicamente "SEGURO", mas sem ver o código-fonte, você não pode ter certeza. Portanto, você precisa testar, mas o teste requer mais de 1 pessoa clicando algumas vezes: requer várias sessões simultâneas atingindo esse código para ver se existem condições de corrida. Mas há outros cenários que são ainda mais difíceis de testar, como vazamentos de memória devido a exceções. Alguns métodos em bibliotecas com suporte são restritos devido a isso, mas provavelmente ninguém sabe se métodos em bibliotecas sem suporte têm esses problemas porque não acredito que tenham sido testados.

    Se essa funcionalidade não for voltada para o usuário (ou seja, processo do sistema, funcionalidade interna da empresa etc.), você poderá mitigar a maioria dos problemas (segurança, desempenho, estabilidade) girando uma instância do SQL Server Express e carregando seu projeto lá. Isso isolaria / colocaria em quarentena a funcionalidade SQLCLR não ideal do seu aplicativo de produção. Supondo que você já esteja usando uma conexão externa regular SqlConnection(não a conexão interna / confiável), isso não exigirá nenhuma alteração no seu código.

    O único risco que você não pode mitigar com essa abordagem (ou seja, carregar seu projeto SQLCLR em uma instância isolada) é o potencial de quebra de código se a Microsoft atualizar System.Web(ou qualquer uma de suas dependências que são sugadas ao carregá-lo no SQL Server) para ser uma biblioteca de modo misto. Isso pode nunca acontecer, mas se acontecer, você não poderá carregar essa DLL de terceiros, a menos que eles mudem para o uso de HttpWebRequest, e eles quase não têm motivos para fazer essa alteração.

    ATUALIZAR

    OP Respondeu a uma pergunta relacionada que eles escolheram alterar o tipo de projeto para o aplicativo de console e o agendarão provavelmente com o SQL Agent (mas também podem usar o Agendador de Tarefas do Windows

    Posts relacionados (no StackOverflow):

    1. CREATE PROCEDURE obtém “Msg 6567, Level 16, State 2” para o procedimento armazenado SQLCLR
    2. System.Security.SecurityException com função CLR
    • 7

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve