sp_refreshsqlmodule (Transact-SQL)
S’applique à : SQL Server base de données Azure SQL Azure SQL Managed Instance Azure Synapse Analytics (pools SQL dédiés uniquement)
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 = ] N'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_refreshsqlmodule
sp_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 Transact-SQL de cet article sont fondés sur l’échantillon de base de données AdventureWorks2022
ou AdventureWorksDW2022
fourni, que vous pouvez télécharger à partir de la page d’accueil Échantillons et projets communautaires Microsoft SQL Server.
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é myoldtype
en , 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.
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é.
EXEC 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
EXEC 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
EXEC sys.sp_refreshsqlmodule
@name = 'ddl_trig_database',
@namespace = 'SERVER_DDL_TRIGGER';
GO