sp_refreshsqlmodule (Transact-SQL)
Neu: 12. Dezember 2006
Aktualisiert die Metadaten für die angegebene nicht schemagebundene gespeicherte Prozedur, benutzerdefinierte Funktion oder Sicht. Permanente Metadaten für diese Objekte, z. B. Datentypen von Parametern, können aufgrund von Änderungen an den zugrunde liegenden Objekten veraltet sein.
Transact-SQL-Syntaxkonventionen
Syntax
sp_refreshsqlmodule [ @name = ] 'module_name'
Argumente
- [ @name= ] 'module_name'
Der Name der gespeicherten Prozedur, Funktion oder Sicht. module_name darf keine gespeicherte Prozedur oder Funktion der CLR (Common Language Runtime) darstellen. module_name darf nicht schemagebunden sein. module_name ist nvarchar und verfügt über keinen Standard. module_name kann ein mehrteiliger Bezeichner sein, aber nur auf Objekte in der aktuellen Datenbank verweisen.
Rückgabecodewerte
0 (Erfolg) oder eine Zahl ungleich Null (Fehler)
Hinweise
sp_refreshsqlmodule sollte ausgeführt werden, wenn Änderungen an den Objekten vorgenommen werden, die der gespeicherten Prozedur, benutzerdefinierten Funktion oder Sicht zugrunde liegen, die sich auf die Definition auswirkt. Andernfalls kann das Objekt bei einer Abfrage oder einem Aufruf unerwartete Ergebnisse generieren. Wenn Sie eine Sicht aktualisieren möchten, können Sie sp_refreshsqlmodule oder sp_refreshview mit gleichen Ergebnissen verwenden.
sp_refreshsqlmodule wirkt sich nicht auf Berechtigungen, erweiterte Eigenschaften oder SET-Optionen für das Objekt aus.
Sämtliche dem Objekt zugeordneten Signaturen werden beim Ausführen von sp_refreshsqlmodule gelöscht.
Berechtigungen
Erfordert die ALTER-Berechtigung für die gespeicherte Prozedur, Funktion oder Sicht und die REFERENCES-Berechtigung für alle benutzerdefinierten CLR-Typen und XML-Schemasammlungen, auf die durch das Objekt verwiesen wird.
Zusätzlich ist für Module, die mit der EXECUTE AS-Klausel definiert wurden, die IMPERSONATE-Berechtigung für den angegebenen Prinzipal erforderlich. Im Allgemeinen wird beim Aktualisieren eines Objekts dessen EXECUTE AS-Prinzipal nicht geändert, es sei denn, das Modul wurde mit EXECUTE AS USER definiert und der Benutzername des Prinzipals wird jetzt zu einem anderen Benutzer aufgelöst als zur Erstellungszeit des Moduls.
Beispiele
Im folgenden Beispiel wird eine benutzerdefinierte Funktion aktualisiert. In dem Beispiel werden der Aliasdatentyp mytype
und die benutzerdefinierte Funktion to_upper
, die mytype
verwendet, erstellt. Anschließend wird mytype
in myoldtype
umbenannt, und ein neuer mytype
wird mit einer anderen Definition erstellt. Die to_upper
-Funktion wird aktualisiert, sodass sie auf die neue Implementierung von mytype
verweist und nicht auf die alte.
-- 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
Siehe auch
Verweis
sp_refreshview (Transact-SQL)
Gespeicherte Prozeduren für das Datenbankmodul (Transact-SQL)