sp_refreshsqlmodule (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics (nur dedizierter SQL-Pool)
Aktualisiert die Metadaten für die angegebene nicht schemagebundene gespeicherte Prozedur, benutzerdefinierte Funktion oder Sicht, den DML-Trigger, DDL-Trigger auf Datenbankebene oder DDL-Trigger auf Serverebene in der aktuellen Datenbank. Persistente Metadaten für diese Objekte, z. B. Datentypen von Parametern, können aufgrund von Änderungen an den zugrunde liegenden Objekten veraltet sein. Beispielsweise wird möglicherweise ein Fehler wie The definition for user-defined data type 'typename' has changed
. Das Aktualisieren der Metadaten für das Modul, das den im Fehler angegebenen Typ verwendet, kann das Problem beheben.
Transact-SQL-Syntaxkonventionen
Syntax
sys.sp_refreshsqlmodule [ @name = ] 'module_name'
[ , [ @namespace = ] ' <class> ' ]
<class> ::=
{
| DATABASE_DDL_TRIGGER
| SERVER_DDL_TRIGGER
}
Argumente
@name
Der Name der gespeicherten Prozedur, der benutzerdefinierten Funktion, der Sicht, des DML-Triggers, des DDL-Triggers auf Datenbankebene oder des DDL-Triggers auf Serverebene. module_name kann keine gespeicherte ClR-Prozedur (Common Language Runtime) oder eine CLR-Funktion sein. module_name kann nicht schemagebunden sein. module_name ist "nvarchar" ohne Standard. module_name kann ein mehrteiliger Bezeichner sein, kann jedoch nur auf Objekte in der aktuellen Datenbank verweisen.
@namespace
Klasse des angegebenen Moduls. Wenn module_name ein DDL-Trigger ist, <ist eine Klasse> erforderlich. <Klasse> ist nvarchar(20). Gültige Eingaben sind:
DATABASE_DDL_TRIGGER
SERVER_DDL_TRIGGER – Gilt für: SQL Server 2008 (10.0.x) und höher.
Rückgabecodewerte
0 (Erfolg) oder eine Zahl ungleich Null (Fehler)
Hinweise
Die gespeicherte Systemprozedur sp_refreshsqlmodule
sollte ausgeführt werden, wenn Änderungen an den Objekten vorgenommen werden, die dem Modul zugrunde liegen, die sich auf die Definition auswirken. Andernfalls kann das Modul bei einer Abfrage oder einem Aufruf unerwartete Ergebnisse generieren. Um eine Ansicht zu aktualisieren, können Sie entweder sp_refreshsqlmodule
oder sp_refreshview
mit denselben Ergebnissen arbeiten.
sp_refreshsqlmodule
hat keine Auswirkungen auf Berechtigungen, erweiterte Eigenschaften oder SET-Optionen, die dem Objekt zugeordnet sind.
Um einen DDL-Trigger auf Serverebene zu aktualisieren, führen Sie diese gespeicherte Prozedur aus dem Kontext einer beliebigen Datenbank aus.
Hinweis
Alle Signaturen, die dem Objekt zugeordnet sind, werden beim Ausführen sp_refreshsqlmodule
verworfen.
Berechtigungen
Erfordert die ALTER-Berechtigung für das Modul und die REFERENCES-Berechtigung für alle CLR-benutzerdefinierten Typen und XML-Schemaauflistungen, auf die durch das Objekt verwiesen wird. Erfordert eine ALTER ANY DATABASE DDL TRIGGER-Berechtigung in der aktuellen Datenbank, wenn es sich beim angegebenen Modul um einen DDL-Trigger auf Datenbankebene handelt. Erfordert eine CONTROL SERVER-Berechtigung, wenn es sich beim angegebenen Modul um einen DDL-Trigger auf Serverebene handelt.
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
A. Aktualisieren einer benutzerdefinierten Funktion
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 dbo.to_upper
-Funktion wird aktualisiert, sodass sie auf die neue Implementierung von mytype
verweist und nicht auf die alte.
-- 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. Aktualisieren eines DDL-Triggers auf Datenbankebene
Im folgenden Beispiel wird ein DDL-Trigger auf Datenbankebene aktualisiert.
USE AdventureWorks2022;
GO
EXEC sys.sp_refreshsqlmodule @name = 'ddlDatabaseTriggerLog' , @namespace = 'DATABASE_DDL_TRIGGER';
GO
C. Aktualisieren eines DDL-Triggers auf Serverebene
Im folgenden Beispiel wird ein DDL-Trigger auf Serverebene aktualisiert.
Gilt für: SQL Server 2008 (10.0.x) und höher.
USE master;
GO
EXEC sys.sp_refreshsqlmodule @name = 'ddl_trig_database' , @namespace = 'SERVER_DDL_TRIGGER';
GO