Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Actualisation des métadonnées sur les fonctions utilisateur t-SQL

la réponse de gbn est préférable - mais lorsque vous avez SCHEMABINDING, cela vous empêche souvent d'apporter des modifications sous-jacentes sans d'abord supprimer SCHEMABINDING, puis le remplacer lors de la recréation du module. Vous ne pouvez pas utiliser SCHEMABINDING si votre objet référence des objets en dehors de la base de données.

Si cette difficulté est si grande que vous ne souhaitez pas ou ne pouvez pas utiliser SCHEMABINDING, utilisez alors sp_refreshsqlmodule dans une sorte de processus régulier que vous exécutez pour vérifier les erreurs de vos modules SQL avant qu'ils ne soient réellement utilisés (il peut être exécuté sur n'importe quelle vue non liée au schéma, UDF, proc stocké, etc.) est votre ami.

Vous pouvez utiliser les deux techniques ensemble - vous ne pouvez pas (et il n'est pas nécessaire) d'exécuter sp_refreshsqlmodule sur des objets liés au schéma.

par exemple, vous ne pouvez l'exécuter que sur ces modules :

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
                )