Partager via


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'

Nom de la procédure stockée, de la fonction définie par l’utilisateur, de la vue, du déclencheur DML, du déclencheur DDL au niveau de la base de données ou du 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é au schéma. @name peut être un identificateur en plusieurs parties, mais ne peut faire référence qu’aux objets de la base de données active.

[ @namespace = ] N’namespace'

Classe du module spécifié. @namespace est nvarchar(20), avec la valeur par défaut OBJECT. Quand @name est un déclencheur DDL, @namespace est nécessaire. Les entrées valides sont DATABASE_DDL_TRIGGER et SERVER_DDL_TRIGGER.

Valeurs des codes de retour

0 (réussite) ou 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 SET options 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.

A. 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.

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