Udostępnij za pomocą


sp_refreshsqlmodule (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure 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