Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Atualizando metadados em funções de usuário t-SQL


resposta do gbn é melhor - mas quando você tem SCHEMABINDING, isso geralmente impede que você faça alterações subjacentes sem primeiro remover SCHEMABINDING e substituí-lo ao recriar o módulo. Você não pode usar SCHEMABINDING se seu objeto fizer referência a objetos fora do banco de dados.

Se essa dificuldade for tão grande que você não deseja ou não pode usar SCHEMABINDING, use sp_refreshsqlmodule em algum tipo de processo regular que você executa para verificar se há erros em seus módulos SQL antes que eles sejam realmente usados ​​(pode ser executado em qualquer exibição não vinculada a esquema, UDF, proc armazenado etc.) é seu amigo.

Você pode usar as duas técnicas juntas - você não pode (e não há necessidade de) executar sp_refreshsqlmodule em objetos vinculados ao esquema.

por exemplo, você só pode executá-lo nestes módulos:
SELECT *
FROM    INFORMATION_SCHEMA.ROUTINES
        WHERE   (
                 OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)), N'IsSchemaBound') IS NULL
                 OR OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)),
                                   N'IsSchemaBound') = 0
                )