sp_refreshsqlmodule (Transact-SQL)

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.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

sys.sp_refreshsqlmodule [ @name = ] 'module_name' 
        [ , [ @namespace = ] ' <class> ' ]

<class> ::=
{
  | DATABASE_DDL_TRIGGER
  | SERVER_DDL_TRIGGER
}

Argomenti

  • [ @name= ] 'module_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 o una funzione CLR (Common Language Runtime). module_name non può corrispondere a un oggetto associato a schema. module_name è nvarchar e non prevede alcun valore predefinito. module_name può essere un identificatore in più parti, ma può essere esclusivamente riferito a oggetti nel database corrente.

  • [ , @namespace = ] ' <class> '
    Classe del modulo specificato. Quando module_name è un trigger DDL, <class> è obbligatorio. Input validi sono DATABASE_DDL_TRIGGER e SERVER_DDL_TRIGGER.

    <class> è nvarchar(20).

Valori restituiti

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

Osservazioni

È consigliabile eseguire sp_refreshsqlmodule quando vengono apportate modifiche agli oggetti sottostanti il modulo che influiscono sulla definizione. In caso contrario, le query o le chiamate su tale modulo potrebbero generare risultati imprevisti. Per aggiornare una vista, è possibile utilizzare sp_refreshsqlmodule o sp_refreshview con risultati identici.

L'esecuzione di sp_refreshsqlmodule non influisce sulle autorizzazioni, le 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]

Le eventuali 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 gli insiemi di schemi XML 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

A. 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 AdventureWorks;
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 AdventureWorks;
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.

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