Estou tentando automatizar o processo que executa as alterações no banco de dados SQL Server 2008 R2. O processo que coloquei em prática descarta e recria meus procedimentos e funções armazenados, além de executar scripts para alterar as tabelas/colunas/dados. Infelizmente, um dos scripts requer que uma das funções seja implementada primeiro. Mas não posso executar todas as alterações de proc/função armazenadas primeiro porque depende primeiro das colunas adicionadas dos scripts de alteração de tabelas/colunas/dados.
Eu queria saber se era possível executar procedimentos e funções armazenadas sem o SQL Server validar as colunas usadas na definição da função/SP? Tentei procurar, mas não consegui encontrar uma condição ou comando para habilitar isso.
Você pode criar procedimentos armazenados que referenciam objetos que ainda não existem (por exemplo, tabelas e funções). Você não pode criar procedimentos armazenados que fazem referência a colunas que ainda não existem em objetos que já existem. Essa é a faca de dois gumes da resolução de nomes adiada - o SQL Server oferece o benefício da dúvida em alguns casos, mas não em todos. Veja as ideias de Erland
SET STRICT_CHECKS ON;
para ter algumas ideias dos lugares que isso funciona e os lugares que ele quebra:http://www.sommarskog.se/strict_checks.html
(E como ele gostaria do oposto do que você procura - você quer permitir que qualquer coisa seja compilada independentemente da existência, e ele quer que cada coluna ou tabela seja verificada.)
Não há configuração como
SET DEFERRED_NAME_RESOLUTION OFF;
se tivesse sido solicitada:http://connect.microsoft.com/sql/127152
E não há configuração como
IGNORE ALL_RESOLUTION;
.Você pode contornar isso de algumas maneiras, incluindo:
(a) usar SQL dinâmico no(s) procedimento(s) armazenado(s) afetado(s).
(b) construa um stub para
CREATE PROCEDURE
sem nada nele, então execute o resto do seu script, então execute umALTER PROCEDURE
que tenha o corpo real (em essência, implemente o procedimento em duas fases).(c) tornar sua ferramenta de implantação mais inteligente sobre a ordem das operações. Se as alterações na tabela exigirem a presença de uma função, faça o script dessas alterações por último. Ferramentas de comparação de esquemas como o SQL Compare da RedGate são muito boas para gerar scripts para você na ordem de dependência adequada. Você não menciona qual ferramenta está usando, mas se não estiver fazendo isso ...
(d) Martin Smith tem uma solução interessante aqui , mas eu não brinquei com ela.
Você pode criar um procedimento armazenado que exclua ou renomeie o objeto em questão primeiro e, em seguida, execute seu procedimento armazenado original como SQL dinâmico. Dessa forma, você não precisa reescrever o procedimento armazenado real para usar SQL dinâmico.
O código abaixo executa um procedimento armazenado que faz referência a colunas que ainda não existem (Expense_Super_Compare)