Condividi tramite


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, della funzione definita dall'utente, della vista, del trigger DML, del trigger DDL a livello di database o del trigger DDL a livello di server. @name è nvarchar(776), senza impostazione predefinita. @name non può essere una stored procedure CLR (Common Language Runtime) o una funzione CLR. @name non può essere associato allo 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 è nvarchar(20), con il valore predefinito OBJECT. Quando @name è un trigger DDL, è necessario @namespace . 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 SET opzioni 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 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.

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