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 / 198638
Accepted
Andrew Lackenby
Andrew Lackenby
Asked: 2018-02-24 02:30:58 +0800 CST2018-02-24 02:30:58 +0800 CST 2018-02-24 02:30:58 +0800 CST

Excluindo arquivos de dentro do SQL Server

  • 772

Eu tenho usado xp_delete_filepara excluir arquivos de backup antigos, mas agora preciso excluir arquivos que fazem parte de um aplicativo (como parte do GDPR). Como xp_delete_filesó permitirá que você exclua arquivos de log ou backup, pensei em escrever o meu próprio em C#.

O problema que estou encontrando agora é que procedimentos armazenados estendidos só podem ser implementados no banco de dados mestre. Prefiro conter esse novo procedimento armazenado em meu próprio banco de dados de usuário para poder distribuir via controle de origem etc.

Alguém sabe uma maneira de contornar isso sem usar xp_cmdshell?

Isso pode ser feito no PowerShell. Eu poderia até escrever a coisa toda em C#. No entanto, é realmente útil poder fazê-lo em T-SQL também.

Estou aberto a usar um procedimento armazenado CLR que invoca o código C#. Eu estava pensando em alterar o procedimento armazenado para uma função se não puder implantar um procedimento armazenado.

sql-server files
  • 1 1 respostas
  • 431 Views

1 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2018-03-02T22:02:41+08:002018-03-02T22:02:41+08:00

    Os procedimentos armazenados estendidos (XPs) foram preteridos desde o lançamento do SQL Server 2005 e novos projetos não devem usar essa API.

    Isso pode ser feito facilmente via SQLCLR e, sim, você pode retornar uma string (ou a maioria dos tipos de dados) de um método C#. A única construção restrita a retornar um INT é um procedimento armazenado, e isso vale para procedimentos armazenados T-SQL e SQLCLR.

    Você usaria algo ao longo das linhas de:

    using System;
    using System.IO;
    
    public class Stuff
    {
      [SqlFunction(IsPrecise=true)]
      public static SqlString DeleteFile ([SqlFacet(MaxSize=500)] SqlString FilePath)
      {
        string _ReturnMessage = String.Empty;
    
        try
        {
          File.Delete(FilePath.Value);
    
          _ReturnMessage = "some text here";
        }
        catch (Exception _Error)
        {
          _ReturnMessage = _Error.Message;
        }
      }
    
      return new SqlString(_ReturnMessage);
    }
    

    Ao criar o objeto wrapper T-SQL, certifique-se de especificar a RETURNS NULL ON NULL INPUTopção para que ela não seja executada se a NULLfor passada (você provavelmente deve adicionar validação adicional ao método, como retornar se uma string vazia for passada em, etc):

    CREATE FUNCTION dbo.DeleteFile
    (
      @FilePath NVARCHAR(500)
    )
    WITH RETURNS NULL ON NULL INPUT
    EXTERNAL NAME.... ;
    

    Como o Assembly precisará ser marcado como PERMISSION_SET = EXTERNAL_ACCESS, não defina o banco de dados como TRUSTWORTHY ON. Em vez disso, você deve assinar o Assembly, criar a chave ou certificado assimétrico em [master], criar um logon a partir dessa chave ou certificado assimétrico e, em seguida, conceder a EXTERNAL ACCESS ASSEMBLYpermissão de logon (se estiver usando o SQL Server 2005 - 2016) ou a UNSAFE ASSEMBLYpermissão (começando com o SQL Server 2017 ).

    Para obter instruções detalhadas sobre como fazer isso por meio de um processo de compilação, você pode tentar uma das duas técnicas que descrevo nas seguintes postagens do blog (ambas funcionam totalmente com SSDT ou de forma independente):

    • SQLCLR vs. SQL Server 2017, Parte 2: “CLR estrita segurança” – Solução 1
    • SQLCLR vs. SQL Server 2017, Parte 3: “CLR estrita segurança” – Solução 2

    Considere também apoiar minha sugestão de chave assimétrica que eliminaria a maior parte do incômodo de publicar assemblies assinados:

    Permitir que a chave assimétrica seja criada a partir da string de bytes hexadecimais binários, assim como CREATE CERTIFICATE

    OU, se você preferir não lidar com nada disso, existe uma função File_Delete na biblioteca SQL# SQLCLR (que eu escrevi) que faz isso. Ele ainda retorna uma string, que é a mensagem de erro se ocorrer um erro, senão é apenas uma string vazia. No entanto, não há como fazer com que ele retorne uma string personalizada em caso de sucesso. Além disso, observe que, embora haja uma versão gratuita, as funções do sistema de arquivos estão disponíveis apenas na versão completa. Mas o aspecto de segurança seria tratado de forma limpa e adequada, e existe até um T-SQL Stored Procedure, que existe no mesmo banco de dados que o código SQLCLR, que configurará o Asymmetric Keye associado Loginem[master](o que pode ajudar nas implantações em novos sistemas, não exigindo uma instalação completa, desde que este procedimento armazenado tenha sido implantado e executado antes da implantação de quaisquer Assemblies (assumindo um ambiente do SQL Server 2017)).

    ATUALIZAR

    O SQL Server 2019 (que não estava disponível no momento em que publiquei esta resposta) apresenta um novo procedimento armazenado do sistema não documentado, xp_delete_files, que é um pouco mais flexível do que o xp_delete_file. Para mais informações, veja minha resposta aqui (também no DBA.SE):

    Como o novo procedimento armazenado do sistema sys.xp_delete_files é diferente de sys.xp_delete_file?

    • 1

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