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 dedicato)

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 di sintassi Transact-SQL

Sintassi

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

Argomenti

@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. module_name non può essere una stored procedure CLR (Common Language Runtime) o una funzione CLR. module_name non può essere associato a schema. module_name è nvarchar, senza impostazione predefinita. module_name può essere un identificatore in più parti, ma può fare riferimento solo agli oggetti nel database corrente.

@namespace

Classe del modulo specificato. Quando module_name è un trigger DDL, <è necessaria la classe> . <la classe> è nvarchar(20). Gli input validi sono:

  • DATABASE_DDL_TRIGGER

  • edizione StandardRVER_DDL_TRIGGER - Si applica a: SQL Server 2008 (10.0.x) e versioni successive.

Valori del codice restituito

0 (esito positivo) o un numero diverso da zero (esito negativo)

Osservazioni:

La stored procedure sp_refreshsqlmodule di sistema deve essere eseguita quando vengono apportate modifiche agli oggetti sottostanti al modulo che ne influiscono sulla definizione. In caso contrario, le query o le chiamate su tale modulo potrebbero generare risultati imprevisti. Per aggiornare una visualizzazione, è possibile usare sp_refreshsqlmodule o sp_refreshview con gli stessi risultati.

sp_refreshsqlmodulenon influisce su autorizzazioni, proprietà estese o opzioni edizione Standard T 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 di XML Schema a cui fa riferimento l'oggetto. È necessario disporre dell'autorizzazione ALTER ANY DATABASE DDL TRIGGER per il database corrente quando il modulo specificato è un trigger DDL a livello di database. Richiede l'autorizzazione CONTROL SERVER quando il modulo specificato è un trigger DDL a livello di server.

Per i moduli definiti nella clausola EXECUTE AS è inoltre richiesta l'autorizzazione IMPERSONATE per l'entità specificata. In genere, l'aggiornamento di un oggetto non comporta modifiche per l'entità EXECUTE AS corrispondente, a meno che il modulo non venga definito con EXECUTE AS USER e il nome utente dell'entità non venga risolto in seguito in un utente diverso da quello utilizzato al momento della creazione del modulo.

Esempi

R. Aggiornamento di 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. Il tipo di dati mytype viene quindi rinominato in myoldtype e viene creato un nuovo mytype con una diversa definizione. La funzione dbo.to_upper viene aggiornata in modo da fare riferimento alla nuova implementazione di mytype, anziché alla precedente.

-- 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. Aggiornamento di 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. Aggiornamento di un trigger DDL a livello di server

Nell'esempio seguente viene aggiornato un trigger DDL a livello di server.

Si applica a: SQL Server 2008 (10.0.x) e versioni successive.

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

Passaggi successivi