Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics (tylko dedykowana pula SQL)
Baza danych SQL w usłudze Microsoft Fabric
Aktualizuje metadane dla określonej procedury przechowywanej niepowiązanej ze schematem, funkcji zdefiniowanej przez użytkownika, widoku, wyzwalacza DML, wyzwalacza DDL na poziomie bazy danych lub wyzwalacza DDL na poziomie serwera w aktualnej bazie danych. Trwałe metadane tych obiektów, takie jak typy danych i parametry, mogą stać się przestarzałe z powodu zmian w ich obiektach bazowych. Na przykład możesz zobaczyć błąd taki jak The definition for user-defined data type 'typename' has changed. Odświeżenie metadanych modułu używającego typu określonego w błędzie może rozwiązać problem.
Transact-SQL konwencje składni
sp_refreshsqlmodule
[ @name = ] N'name'
[ , [ @namespace = ] { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER } ]
[ ; ]
Arguments
[ @name = ] N'imię'
Nazwa procedury składowanej, funkcji zdefiniowanej przez użytkownika, widoku, wyzwalacza DML, wyzwalacza DDL na poziomie bazy danych lub wyzwalacza DDL na poziomie serwera. @name jest nvarchar(776), bez wartości domyślnej. @name nie może być procedurą składowaną środowiska uruchomieniowego języka wspólnego (CLR) ani funkcją CLR. @name nie można powiązać ze schematem. @name może być identyfikatorem wieloczęściowym, ale może odwoływać się tylko do obiektów w bieżącej bazie danych.
[ @namespace = ] N'namespace'
Klasa określonego modułu.
@namespace to nvarchar(20), z wartością domyślną OBJECT. Gdy @name jest wyzwalaczem DDL, wymagane jest @namespace . Prawidłowe dane wejściowe to DATABASE_DDL_TRIGGER i SERVER_DDL_TRIGGER.
Zwracanie wartości kodu
0 (powodzenie) lub liczba niezerowa (niepowodzenie).
Uwagi
sp_refreshsqlmodule powinny być wykonywane, gdy wprowadzane są zmiany w obiektach leżących u podstaw modułu, które wpływają na jego definicję. W przeciwnym razie moduł może generować nieoczekiwane wyniki podczas zapytania lub wywołania. Aby odświeżyć widok, możesz użyć jednego lub sp_refreshsqlmodulesp_refreshview drugiego, z tym samym efektem.
sp_refreshsqlmodule nie ma wpływu na żadne uprawnienia, właściwości rozszerzone ani SET opcje skojarzone z obiektem.
Aby odświeżyć wyzwalacz DDL na poziomie serwera, wykonaj tę procedurę składowaną z kontekstu dowolnej bazy danych.
Uwaga / Notatka
Wszelkie sygnatury skojarzone z obiektem są porzucane po uruchomieniu polecenia sp_refreshsqlmodule.
Permissions
Wymaga uprawnień ALTER do modułu oraz uprawnień REFERENCES do dowolnych typów zdefiniowanych przez użytkownika w środowisku CLR oraz kolekcji schematów XML, do których odwołuje się obiekt. Wymaga ALTER ANY DATABASE DDL TRIGGER uprawnień w aktualnej bazie danych, gdy określony moduł jest triggerem DDL na poziomie bazy danych. Wymaga CONTROL SERVER uprawnień, gdy określony moduł jest wyzwalaczem DDL na poziomie serwera.
Dodatkowo, dla modułów zdefiniowanych za pomocą klauzuli EXECUTE AS , IMPERSONATE wymagane jest pozwolenie na określony principal. Zazwyczaj odświeżenie obiektu nie zmienia jego EXECUTE AS principalu, chyba że moduł został zdefiniowany z i EXECUTE AS USER nazwa użytkownika principala teraz rozwiązuje się do innego użytkownika niż użytkownik w momencie utworzenia modułu.
Przykłady
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
A. Odśwież funkcję zdefiniowaną przez użytkownika
Poniższy przykład odświeża funkcję zdefiniowaną przez użytkownika. Przykład tworzy typ danych alias, mytype, oraz funkcję zdefiniowaną przez użytkownika, to_upper, która wykorzystuje mytype. Następnie przemianowany mytype jest na myoldtype, a powstaje nowa mytype , która ma inną definicję. Funkcja dbo.to_upper jest odświeżana, aby odwoływać się do nowej implementacji , mytypezamiast do starej.
W pierwszym kroku utwórz typ aliasu.
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
Następnie zwiększ długość typu alias.
EXECUTE sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO
CREATE TYPE mytype
FROM NVARCHAR (10);
GO
Parametr funkcji nadal używa starego typu i zawodzi z powodu obcięcia.
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
Odśwież funkcję, aby powiązała ją z przemianowanym typem.
EXECUTE sys.sp_refreshsqlmodule 'dbo.to_upper';
Parametry funkcji są teraz powiązane z właściwym typem i instrukcje działają poprawnie.
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. Odśwież wyzwalacz DDL na poziomie bazy danych
Poniższy przykład odświeża wyzwalacz DDL na poziomie bazy danych.
USE AdventureWorks2022;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddlDatabaseTriggerLog',
@namespace = 'DATABASE_DDL_TRIGGER';
GO
C. Odśwież wyzwalacz DDL na poziomie serwera
Poniższy przykład odświeża wyzwalacz DDL na poziomie serwera.
USE master;
GO
EXECUTE sys.sp_refreshsqlmodule
@name = 'ddl_trig_database',
@namespace = 'SERVER_DDL_TRIGGER';
GO
Treści powiązane
- sp_refreshview (Transact-SQL)
- procedury składowane aparatu bazy danych (Transact-SQL)