Freigeben über


sp_refreshsqlmodule (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics (nur dedizierte SQL-Pools)

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

sp_refreshsqlmodule
    [ @name = ] N'name'
    [ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]

Argumente

[ @name = ] N'name'

Der Name der gespeicherten Prozedur, benutzerdefinierte Funktion, Ansicht, DML-Trigger, DDL-Trigger auf Datenbankebene oder DDL-Trigger auf Serverebene. @name ist nvarchar(776), ohne Standard. @name kann keine gespeicherte Prozedur (Common Language Runtime, CLR) oder eine CLR-Funktion sein. @name kann nicht schemagebunden sein. @name kann ein mehrteiliger Bezeichner sein, kann jedoch nur auf Objekte in der aktuellen Datenbank verweisen.

[ @namespace = ] N'namespace'

Die Klasse des angegebenen Moduls. @namespace ist "nvarchar(20)", mit einem Standardwert von OBJECT. Wenn @name ein DDL-Trigger ist, ist @namespace erforderlich. Gültige Eingaben sind DATABASE_DDL_TRIGGER und SERVER_DDL_TRIGGER.

Rückgabecodewerte

0 (Erfolg) oder eine Nichtzeronummer (Fehler).

Hinweise

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 unerwartete Ergebnisse erzielen, wenn abgefragt oder aufgerufen wird. 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 von sp_refreshsqlmodule verworfen.

Berechtigungen

Erfordert die ALTER-Berechtigung für das Modul und die REFERENCES-Berechtigung für alle CLR-benutzerdefinierten Typen und XML-Schema-Sammlungen, auf die durch das Objekt verwiesen wird. Erfordert ALTER ANY DATABASE DDL TRIGGER die Berechtigung in der aktuellen Datenbank, wenn das angegebene Modul ein DDL-Trigger auf Datenbankebene ist. Erfordert CONTROL SERVER berechtigungen, wenn das angegebene Modul ein DDL-Trigger auf Serverebene ist.

Darüber hinaus ist für Module, die mit der EXECUTE AS Klausel definiert sind, IMPERSONATE die Berechtigung für den angegebenen Prinzipal erforderlich. Im Allgemeinen ändert EXECUTE AS das Aktualisieren eines Objekts seinen Prinzipal nicht, es sei denn, das Modul wurde mit EXECUTE AS USER definiert und der Benutzername des Prinzipals wird nun zu einem anderen Benutzer aufgelöst als der Benutzer zum Zeitpunkt der Erstellung des Moduls.

Beispiele

Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022- oder AdventureWorksDW2022-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.

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. mytype Anschließend wird sie umbenannt myoldtypein , und es wird eine neue mytype Definition erstellt, die eine andere Definition ist. Die dbo.to_upper-Funktion wird aktualisiert, sodass sie auf die neue Implementierung von mytype verweist und nicht auf die alte.

Erstellen Sie im ersten Schritt einen Aliastyp.

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

Als Nächstes erhöhen Sie die Länge des Aliastyps.

sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO

CREATE TYPE mytype FROM NVARCHAR(10);
GO

Der Funktionsparameter verwendet weiterhin den alten Typ und schlägt aufgrund des Abschneidens fehl.

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

Aktualisieren Sie die Funktion, um eine Bindung an den umbenannten Typ zu erstellen.

EXEC sys.sp_refreshsqlmodule 'dbo.to_upper';

Die Funktionsparameter sind nun an den richtigen Typ gebunden, und die Anweisung funktioniert ordnungsgemäß.

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.

USE master;
GO

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