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 / 7422
Accepted
bernd_k
bernd_k
Asked: 2011-11-01 05:21:11 +0800 CST2011-11-01 05:21:11 +0800 CST 2011-11-01 05:21:11 +0800 CST

Existem maneiras de substituir apenas os procedimentos armazenados do SQL Server quando a definição for alterada?

  • 772

Conheço os dois padrões a seguir para escrever scripts para criar procedimentos armazenados, que podem ser executados repetidamente sem gerar erros.

if object_id('my_proc') > 0 drop procedure my_proc
go
create procedure dbo.my_proc as Print 'This is not a dummy';

e o outro que preserva as permissões

if object_id('my_proc') is null
    EXEC ('create procedure dbo.my_proc as Print ''This is a dummy''');
go
ALTER PROCEDURE dbo.my_proc as Print 'This is not a dummy';
    

Eu acho que quando o procedimento existe e seu código hash é o mesmo da nova versão, não haveria necessidade de descartar e recriar ou alterar o procedimento.

Meu problema é que o HashBytes é limitado a no máximo 8000 bytes e geralmente não consigo usá-lo como

if object_id('my_proc') is null
    EXEC ('create procedure dbo.my_proc as Print ''This is a dummy''');
go
if object_Id('my_proc') > 0
and
(
Select HashBytes('MD5',definition) MD5
from sys.sql_modules m
join sysobjects o on o.id = m.object_id
where o.name = 'my_proc'
) <> 0x9028A1B9D93AC7592EC939CCABF9D3DE
begin
    print 'definition has changed';
    EXEC ('ALTER PROCEDURE dbo.my_proc as Print ''This is not a dummy''');
end 

Para procedimentos cuja definição tenha mais de 4.000 caracteres. Alguma proposta para lidar com esses casos de maneira semelhante?

Editar:

Não quero apenas evitar a liberação de planos em cache.

Também tenho que lidar com clientes diferentes com versões diferentes de um procedimento armazenado, onde desejo apenas substituir uma dessas variantes por uma versão mais recente.

sql-server stored-procedures
  • 3 3 respostas
  • 3174 Views

3 respostas

  • Voted
  1. gbn
    2011-11-01T05:52:56+08:002011-11-01T05:52:56+08:00

    As permissões não devem ser atribuídas ao procedimento armazenado

    Seu procedimento armazenado deve estar em um esquema, as permissões estão no esquema (concedidas a funções). Dessa forma, novos objetos nesse esquema têm permissões automaticamente. Nenhum objeto único deve ter permissões

    Então, de qualquer maneira seria OK.

    Veja estas outras questões de DBA:

    • Definir permissões em todos os objetos para usuários SQL
    • Qual padrão devo seguir ao nomear tabelas e exibições?
    • Projeto de esquema - práticas recomendadas?

    FYI, object_id é assinado int , então use "não é igual"

    if object_id('my_proc') <> 0 drop procedure my_proc
    

    Editar, nvarchar(max) é comparável diretamente

    if object_Id('my_proc') <> 0
        drop proc ThenewProc
    GO
    CREATE PROC ThenewProc
    ...
    GO
    
    IF object_definition(object_id('my_proc')) <> 
             object_definition(object_id('ThenewProc')) <> 0
    BEGIN
        drop procedure my_proc
        drop proc ThenewProc
    END
    GO
    CREATE PROC my_proc
    ...
    GO
    
    • 6
  2. Best Answer
    Nick Chammas
    2011-11-01T07:22:52+08:002011-11-01T07:22:52+08:00

    Recentemente, tivemos essa discussão no meu local de trabalho.

    Primeiro, quero elogiá-lo por fazer a "coisa certa" usando HASHBYTES()over CHECKSUM()para detectar alterações. A Microsoft adverte especificamente contra o uso CHECKSUM(@input)para essa finalidade, pois sua taxa de colisão é muito alta em comparação com a do HASHBYTES('SHA1', @input). Uma vantagem CHECKSUM(), porém, é que não há restrição (óbvia) no tamanho de sua entrada.

    Em segundo lugar, se você usar HASHBYTES(), recomendo usar SHA1como algoritmo de hash. Das opções disponíveis, SHA1tem a menor taxa de colisão e a velocidade não é uma preocupação para o seu caso de uso.

    Finalmente, para usar HASHBYTES()contra entradas maiores que 8000 bytes, você terá que:

    1. Divida sua entrada em blocos de 8.000 bytes.
    2. Faça um hash em cada pedaço.
    3. De alguma forma, combine os hashes resultantes e faça o hash deles para obter sua saída final.

      Você pode fazer isso de duas maneiras:

      1. Converta suas saídas de hash em strings, concatene-as e faça o hash do resultado.
      2. Coloque todas as suas saídas de hash em uma tabela de memória e obtenha sua soma de verificação agregada usando CHECKSUM_AGG().
    4. Encapsule esse trabalho como uma função que recebe NVARCHAR(MAX)como entrada.

    Dito isso, é mais simples comparar as definições de proc diretamente usando OBJECT_DEFINITION()como gbn sugeriu , ou simplesmente enviar todas as definições para todos os lugares quantas vezes quiser, como sugeriu Mike .

    Eu me pergunto que tipo de ambiente se beneficiaria significativamente de um processo que implantasse apenas procedimentos alterados e usasse hashes para evitar a cópia e a comparação de definições completas. Você precisaria ter muitos procedimentos para se manter sincronizado.

    • 3
  3. Mike Walsh
    2011-11-01T05:31:21+08:002011-11-01T05:31:21+08:00

    Eu diria que a melhor resposta aqui é apenas descartar/recriar quantas vezes quiser - Apenas crie o script das permissões e execute-o. Você pode executar o script de permissões quantas vezes quiser, sem erros.

    Tentar criar uma metodologia de hash eficaz, segura e confiável para modificar apenas os procedimentos afetados não é realmente necessário quando você apenas solta, recria e executa seu script de permissão.

    Você encontrará muitas lojas que fazem implantações dessa maneira.

    • 2

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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