sp_refreshsqlmodule (Transact-SQL)
Data creazione: 12 dicembre 2006
Aggiorna i metadati per la stored procedure, la funzione definita dall'utente o la vista non associata a schema specificata. I metadati persistenti per questi oggetti, come i tipi di dati dei parametri, possono diventare obsoleti in seguito a modifiche degli oggetti sottostanti.
Convenzioni della sintassi Transact-SQL
Sintassi
sp_refreshsqlmodule [ @name = ] 'module_name'
Argomenti
- [ @name= ] 'module_name'
Nome della stored procedure, funzione o vista. 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 è di tipo nvarchar e non prevede alcun valore predefinito. module_name può essere un identificatore in più parti, ma esclusivamente riferito a oggetti nel database corrente.
Osservazioni
È consigliabile eseguire sp_refreshsqlmodule quando vengono apportate modifiche agli oggetti sottostanti la stored procedure, la funzione definita dall'utente o la vista, che influiscono sulla definizione. In caso contrario, le query o le chiamate su tali oggetti 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.
Le eventuali firme associate all'oggetto vengono eliminate quando si esegue sp_refreshsqlmodule.
Autorizzazioni
Sono necessarie l'autorizzazione ALTER per la stored procedure, la funzione o la vista e l'autorizzazione REFERENCES per i tipi CLR definiti dall'utente e gli insiemi di schemi XML a cui fa riferimento l'oggetto.
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.
Valori restituiti
0 (esito positivo) o un numero diverso da zero (esito negativo)
Esempi
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 to_upper
viene poi 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 ('to_upper', 'FN') IS NOT NULL
DROP FUNCTION to_upper;
GO
CREATE FUNCTION 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
Vedere anche
Riferimento
sp_refreshview (Transact-SQL)
Stored procedure del Motore di database (Transact-SQL)