sp_refreshsqlmodule (Transact-SQL)
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics (solo pool SQL dedicati)
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 , IMPERSONATE
l'autorizzazione EXECUTE AS
è 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 Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022
o AdventureWorksDW2022
, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.
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 myoldtype
in 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.
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.
EXEC 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
EXEC 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
EXEC sys.sp_refreshsqlmodule
@name = 'ddl_trig_database',
@namespace = 'SERVER_DDL_TRIGGER';
GO