Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di
AzureIstanza gestita di SQL di
AzureAzure Synapse Analytics (solo pool SQL dedicato)
Database SQL in Microsoft Fabric
Aggiorna i metadati per stored procedure non associata a schema specificato, funzione definita dall'utente, vista, trigger DML, trigger DDL a livello di database, o trigger DDL a livello di server nel database corrente. I metadati persistenti per questi oggetti, come i tipi di dati dei parametri, possono diventare obsoleti in seguito a modifiche degli oggetti sottostanti. Ad esempio, è possibile che venga visualizzato un errore come The definition for user-defined data type 'typename' has changed. L'aggiornamento dei metadati per il modulo che usa il tipo specificato nell'errore potrebbe risolvere il problema.
Convenzioni relative alla sintassi Transact-SQL
sp_refreshsqlmodule
[ @name = ] N'name'
[ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]
Argomenti
[ @name = ] N'name'
Nome della stored procedure, funzione definita dall'utente, vista, trigger DML, trigger DDL a livello di database o trigger DDL a livello di server. @name is nvarchar(776),, senza alcun valore predefinito. @name non può essere una stored procedure CLR (Common Language Runtime) o una funzione CLR. @name non può essere associato a uno schema. @name può essere un identificatore in più parti, ma può fare riferimento solo agli oggetti nel database corrente.
[ @namespace = ] N'namespace'
Classe del modulo specificato.
@namespace is nvarchar(20), con il valore predefinito di OBJECT. Se @name è un trigger DDL, allora @namespace è obbligatorio. Gli input validi sono DATABASE_DDL_TRIGGER e SERVER_DDL_TRIGGER.
Valori del codice restituito
0 (esito positivo) o un numero diverso da zero (errore).
Osservazioni:
sp_refreshsqlmodule deve essere eseguito quando vengono apportate modifiche agli oggetti sottostanti al modulo che ne influiscono sulla definizione. In caso contrario, il modulo potrebbe produrre risultati imprevisti quando viene eseguita una query o richiamata. Per aggiornare una visualizzazione, è possibile usare sp_refreshsqlmodule o sp_refreshview con gli stessi risultati.
sp_refreshsqlmodule non influisce su autorizzazioni, proprietà estese o le opzioni SET associate all'oggetto.
Per aggiornare un trigger DDL a livello di server, eseguire questa stored procedure dal contesto di un qualsiasi database.
Nota
Tutte le firme associate all'oggetto vengono eliminate quando si esegue sp_refreshsqlmodule.
Autorizzazioni
Sono necessarie l'autorizzazione ALTER per il modulo e l'autorizzazione REFERENCES per i tipi CLR definiti dall'utente e le raccolte dello schema XML a cui fa riferimento l'oggetto. È necessaria ALTER ANY DATABASE DDL TRIGGER l'autorizzazione nel database corrente quando il modulo specificato è un trigger DDL a livello di database. Richiede CONTROL SERVER l'autorizzazione quando il modulo specificato è un trigger DDL a livello di server.
Inoltre, per i moduli definiti con la clausola , EXECUTE AS l'autorizzazione IMPERSONATE è necessaria per l'entità specificata. In genere, l'aggiornamento di un oggetto non modifica EXECUTE AS l'entità, a meno che il modulo non sia stato definito con EXECUTE AS USER e il nome utente dell'entità ora si risolve in un utente diverso rispetto all'utente al momento della creazione del modulo.
Esempi
Gli esempi di codice in questo articolo usano il database di esempio AdventureWorks2025 o AdventureWorksDW2025, che è possibile scaricare dalla home page Microsoft SQL Server Samples and Community Projects.
R. Aggiornare una funzione definita dall'utente
Nell'esempio seguente viene aggiornata una funzione definita dall'utente. Nell'esempio vengono creati il tipo di dati alias mytype e la funzione definita dall'utente to_upper che utilizza mytype.
mytype Viene quindi rinominato myoldtypein e viene creato un nuovo mytype oggetto che rappresenta una definizione diversa. La funzione dbo.to_upper viene aggiornata in modo da fare riferimento alla nuova implementazione di mytype, anziché alla precedente.
Nel primo passaggio creare un tipo di 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
Aumentare quindi la lunghezza del tipo di alias.
EXECUTE sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO
CREATE TYPE mytype
FROM NVARCHAR (10);
GO
Il parametro della funzione usa ancora il tipo precedente e ha esito negativo a causa del troncamento.
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
Aggiornare la funzione per eseguire l'associazione al tipo rinominato.
EXECUTE sys.sp_refreshsqlmodule 'dbo.to_upper';
I parametri della funzione sono ora associati al tipo corretto e l'istruzione funziona correttamente.
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. Aggiornare un trigger DDL a livello di database
Nell'esempio seguente viene aggiornato un trigger DDL a livello di database.
USE AdventureWorks2022;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddlDatabaseTriggerLog',
@namespace = 'DATABASE_DDL_TRIGGER';
GO
C. Aggiornare un trigger DDL a livello di server
Nell'esempio seguente viene aggiornato un trigger DDL a livello di server.
USE master;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddl_trig_database',
@namespace = 'SERVER_DDL_TRIGGER';
GO