sp_refreshsqlmodule (Transact-SQL)

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. Permanente Metadaten für diese Objekte, z. B. Datentypen von Parametern, können aufgrund von Änderungen an den zugrunde liegenden Objekten veraltet sein.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

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

Argumente

  • [ @name= ] 'module_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 darf keine gespeicherte Prozedur oder Funktion der CLR (Common Language Runtime) darstellen. module_name darf nicht schemagebunden sein. module_name ist vom Datentyp nvarchar und verfügt über keinen Standardwert. module_name kann ein mehrteiliger Bezeichner sein, kann jedoch nur auf Objekte in der aktuellen Datenbank verweisen.

  • [ , @namespace = ] ' <class> '
    Klasse des angegebenen Moduls. Wenn es sich bei module_name um einen DDL-Trigger handelt, ist <class> erforderlich. Gültige Eingaben sind DATABASE_DDL_TRIGGER und SERVER_DDL_TRIGGER.

    <class> ist vom Datentyp nvarchar(20).

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 dem Modul zugrunde liegen, das sich auf die zugehörige Definition auswirkt. Andernfalls kann das Modul 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.

Um einen DDL-Trigger auf Serverebene zu aktualisieren, führen Sie diese gespeicherte Prozedur aus dem Kontext einer beliebigen Datenbank aus.

HinweisHinweis

Sämtliche dem Objekt zugeordneten Signaturen werden beim Ausführen von sp_refreshsqlmodule gelöscht.

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. Löschen 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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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.

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