sp_refreshsqlmodule (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (pool SQL dédié 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

Syntaxe

sys.sp_refreshsqlmodule [ @name = ] 'module_name'   
    [ , [ @namespace = ] ' <class> ' ]  
  
<class> ::=  
{  
  | DATABASE_DDL_TRIGGER  
  | SERVER_DDL_TRIGGER  
}  
  

Arguments

@name

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. module_name ne peut pas être une procédure stockée CLR (Common Language Runtime) ou une fonction CLR. module_name ne peut pas être lié au schéma. module_name est nvarchar, sans valeur par défaut. module_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

Classe du module spécifié. Lorsque module_name est un déclencheur DDL, <la classe> est requise. <la classe> est nvarchar(20). Les entrées valides sont :

  • DATABASE_DDL_TRIGGER

  • SERVER_DDL_TRIGGER - S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures.

Codet de retour

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

Notes

La procédure sp_refreshsqlmodule stockée système doit être exécutée lorsque des modifications sont apportées aux objets sous-jacents du module qui affectent sa définition. Sinon, le module risque de produire des résultats inattendus en cas d'interrogation ou d'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 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. Requiert l'autorisation ALTER ANY DATABASE DDL TRIGGER dans la base de données actuelle lorsque le module spécifié est un déclencheur DDL au niveau de la base de données. Requiert l'autorisation CONTROL SERVER lorsque le module spécifié est un déclencheur DDL au niveau du serveur.

De plus, pour les modules définis à l'aide de la clause EXECUTE AS, l'autorisation IMPERSONATE est nécessaire sur le principal spécifié. Généralement, l'actualisation d'un objet ne modifie pas son principal EXECUTE AS sauf si le module est défini avec EXECUTE AS USER et que le nom d'utilisateur du principal correspond désormais à un autre utilisateur que celui lors de la création du module.

Exemples

R. Actualisation d'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. Puis, le nom mytype est remplacé par myoldtype, et un nouveau mytype est créé avec une autre définition. La fonction dbo.to_upper est actualisée afin de référencer la nouvelle implémentation de mytype en remplacement de l'ancienne.

-- Create an alias type.  
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  
  
-- Increase the length of the alias type.  
sp_rename 'mytype', 'myoldtype', 'userdatatype';  
GO  
  
CREATE TYPE mytype FROM nvarchar(10);  
GO  
  
-- The function parameter still uses the old type.  
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  
  
-- Refresh the function to bind to the renamed type.  
EXEC sys.sp_refreshsqlmodule 'dbo.to_upper';  
  
-- The function parameters are now bound to the correct type and the statement works correctly.  
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. Actualisation d'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. Actualisation d'un déclencheur DDL au niveau du serveur

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

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures.

USE master;  
GO  
EXEC sys.sp_refreshsqlmodule @name = 'ddl_trig_database' , @namespace = 'SERVER_DDL_TRIGGER';  
GO  

Étapes suivantes