Partager via


sp_refreshsqlmodule (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (pool SQL dédié uniquement)Base de données SQL dans Microsoft Fabric

Met à jour les métadonnées pour les procédure stockée non liée au schéma, fonction définie par l'utilisateur, vue, déclencheur DML, déclencheur DDL au niveau de la base de données ou déclencheur DDL au niveau du serveur spécifiés dans la base de données actuelle. Les métadonnées persistantes pour ces objets, des types de données des paramètres par exemple, peuvent devenir obsolètes en raison des modifications apportées à leurs objets sous-jacents. Par exemple, vous pouvez voir une erreur semblable The definition for user-defined data type 'typename' has changedà . L’actualisation des métadonnées du module qui utilise le type spécifié dans l’erreur peut résoudre le problème.

Conventions de la syntaxe Transact-SQL

sp_refreshsqlmodule
    [ @name = ] N'name'
    [ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]

Arguments

[ @name = ] name

Le nom de la procédure stockée, fonction définie par l'utilisateur, vue, déclencheur DML, déclencheur DDL au niveau de la base de données ou déclencheur DDL au niveau du serveur. @name est nvarchar(776), sans valeur par défaut. @name ne peut pas être une procédure stockée CLR (Common Language Runtime) ou une fonction CLR. @name ne peut pas être lié à un schéma. @name peut être un identifiant en plusieurs parties, mais il ne peut faire référence qu'à des objets de la base de données actuelle.

[ @namespace = ] N'namespace'

La classe du module spécifié. @namespace est nvarchar(20), avec OBJECT comme valeur par défaut. Lorsque @name est un déclencheur DDL, @namespace est requis. Les entrées valides sont DATABASE_DDL_TRIGGER et SERVER_DDL_TRIGGER.

Valeurs des codes de retour

0 (réussite) ou un nombre différent de zéro (échec).

Notes

sp_refreshsqlmodule doit être exécuté lorsque des modifications sont apportées aux objets sous-jacents au module qui affectent sa définition. Dans le cas contraire, le module peut produire des résultats inattendus lors de l’interrogation ou de l’appel. Pour actualiser une vue, vous pouvez utiliser ou sp_refreshsqlmodulesp_refreshview avec les mêmes résultats.

sp_refreshsqlmodule n’affecte aucune autorisation, propriétés étendues ou les options SET associées à l’objet.

Pour actualiser un déclencheur DDL au niveau du serveur, exécutez cette procédure stockée à partir du contexte de toute base de données.

Remarque

Toutes les signatures associées à l’objet sont supprimées lorsque vous exécutez sp_refreshsqlmodule.

autorisations

Requiert l'autorisation ALTER sur le module ainsi que l'autorisation REFERENCES sur les types CLR (Common Language Runtime) définis par l'utilisateur et sur les collections de schémas XML référencés par l'objet. Nécessite ALTER ANY DATABASE DDL TRIGGER une autorisation dans la base de données active lorsque le module spécifié est un déclencheur DDL au niveau de la base de données. Nécessite CONTROL SERVER une autorisation lorsque le module spécifié est un déclencheur DDL au niveau du serveur.

En outre, pour les modules définis avec la EXECUTE AS clause, IMPERSONATE l’autorisation est requise sur le principal spécifié. En règle générale, l’actualisation d’un objet ne modifie pas son EXECUTE AS principal, sauf si le module a été défini et EXECUTE AS USER que le nom d’utilisateur du principal est désormais résolu en un utilisateur différent de celui de l’utilisateur au moment de la création du module.

Exemples

Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.

R : Actualiser une fonction définie par l’utilisateur

L'exemple suivant actualise une fonction définie par l'utilisateur. L'exemple crée un type de données d'alias, mytype, et une fonction définie par l'utilisateur, to_upper, qui utilise mytype. Ensuite, mytype est renommé myoldtypeen , et un nouveau mytype est créé qui est une définition différente. La fonction dbo.to_upper est actualisée afin de référencer la nouvelle implémentation de mytype en remplacement de l'ancienne.

Dans la première étape, créez un type d’alias.

USE AdventureWorks2022;
GO

IF EXISTS (SELECT 'mytype'
           FROM sys.types
           WHERE name = 'mytype')
    DROP TYPE mytype;
GO

CREATE TYPE mytype
    FROM NVARCHAR (5);
GO

IF OBJECT_ID('dbo.to_upper', 'FN') IS NOT NULL
    DROP FUNCTION dbo.to_upper;
GO

CREATE FUNCTION dbo.to_upper (@a mytype)
RETURNS mytype
WITH ENCRYPTION
AS
BEGIN
    RETURN UPPER(@a);
END
GO

SELECT dbo.to_upper('abcde');
GO

Ensuite, augmentez la longueur du type d’alias.

EXECUTE sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO

CREATE TYPE mytype
    FROM NVARCHAR (10);
GO

Le paramètre de fonction utilise toujours l’ancien type et échoue en raison de la troncation.

SELECT name,
       TYPE_NAME(user_type_id)
FROM sys.parameters
WHERE object_id = OBJECT_ID('dbo.to_upper');
GO

SELECT dbo.to_upper('abcdefgh'); -- Fails because of truncation
GO

Actualisez la fonction pour établir une liaison au type renommé.

EXECUTE sys.sp_refreshsqlmodule 'dbo.to_upper';

Les paramètres de fonction sont désormais liés au type correct et l’instruction fonctionne correctement.

SELECT name,
       TYPE_NAME(user_type_id)
FROM sys.parameters
WHERE object_id = OBJECT_ID('dbo.to_upper');
GO

SELECT dbo.to_upper('abcdefgh');
GO

B. Actualiser un déclencheur DDL au niveau de la base de données

L'exemple suivant actualise un déclencheur DDL au niveau de la base de données.

USE AdventureWorks2022;
GO

EXECUTE sys.sp_refreshsqlmodule
    @name = 'ddlDatabaseTriggerLog',
    @namespace = 'DATABASE_DDL_TRIGGER';
GO

C. Actualiser un déclencheur DDL au niveau du serveur

L'exemple suivant actualise un déclencheur DDL au niveau du serveur.

USE master;
GO

EXECUTE sys.sp_refreshsqlmodule
    @name = 'ddl_trig_database',
    @namespace = 'SERVER_DDL_TRIGGER';
GO