Megosztás a következőn keresztül:


sp_refreshsqlmodule (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse Analytics (csak dedikált SQL-készlet)SQL-adatbázis a Microsoft Fabricben

Frissíti a megadott nem séma-kötött tárolt eljárás, felhasználó által definiált függvény, nézet, DML trigger, adatbázis-szintű DDL trigger vagy szerverszintű DDL trigger metaadatait a jelenlegi adatbázisban. Ezeknek az objektumoknak a tartós metaadatai, például paramétertípusok, elavulhatnak az alapul szolgáló objektumok változása miatt. Például előfordulhat, hogy hibát láthatsz, mint The definition for user-defined data type 'typename' has changed. A hiba által megadott típust használó modul metaadatainak frissítése megoldhatja a problémát.

Transact-SQL szintaxis konvenciók

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

Arguments

[ @name = ] N'name'

A tárolt eljárás neve, felhasználó által definiált függvény, nézet, DML-eseményindító, adatbázisszintű DDL-eseményindító vagy kiszolgálószintű DDL-eseményindító. @name egy nvarchar(776) típusú változó, alapértelmezés nélkül. @name nem lehet általános nyelvi futtatókörnyezet (CLR) tárolt eljárás vagy CLR-függvény. @name nem lehet sémához kötni. @name többrészes azonosító lehet, de csak az aktuális adatbázisban lévő objektumokra hivatkozhat.

[ @namespace = ] N'namespace'

A megadott modul osztálya. @namespacenvarchar(20), alapértelmezés szerint OBJECT. Ha @name DDL-eseményindító, @namespace szükséges. Az érvényes bemenetek a következők DATABASE_DDL_TRIGGER : és SERVER_DDL_TRIGGER.

Kódértékek visszaadása

0 (sikeres) vagy nemero szám (hiba).

Megjegyzések

sp_refreshsqlmodule akkor kell futtatni, amikor a modul mögött álló objektumokban változtatásokat hajtanak végre, amelyek befolyásolják a definícióját. Ellenkező esetben a modul váratlan eredményeket hozhat lekérdezés vagy meghívás során. A nézet frissítéséhez bármelyik vagy sp_refreshsqlmodule azonos eredményt használhatodsp_refreshview.

sp_refreshsqlmodule nincs hatással az objektumhoz társított engedélyekre, kiterjesztett tulajdonságokra vagy SET beállításokra.

Kiszolgálószintű DDL-eseményindító frissítéséhez hajtsa végre ezt a tárolt eljárást bármely adatbázis környezetéből.

Megjegyzés:

Az objektumhoz társított aláírások törlődnek, amikor futtatja sp_refreshsqlmodule.

Permissions

Engedélyre van szükség ALTER a modulhoz és REFERENCES az objektum által hivatkozott CLR-felhasználó által definiált típusokhoz és XML-sémagyűjteményekhez. Engedélyt igényel ALTER ANY DATABASE DDL TRIGGER a jelenlegi adatbázisban, ha a megadott modul adatbázis-szintű DDL trigger. Engedélyt igényel CONTROL SERVER , ha a megadott modul szerverszintű DDL trigger.

Ezen felül, a klauzulával definiált EXECUTE AS modulok esetében IMPERSONATE engedély szükséges a megadott alapelvre. Általában egy objektum frissítése nem változtatja meg a EXECUTE AS fő értékét, kivéve, ha a modul definiálva van definiálva EXECUTE AS USER , és a fő felhasználóneve most már egy másik felhasználóra oszlik meg, mint a modul létrehozásakor a felhasználó.

Példák

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. Felhasználó által definiált függvény frissítése

A következő példa frissít egy felhasználó által definiált függvényt. A példa létrehoz egy alias adattípust, mytype, és egy felhasználó által definiált függvényt, to_upper, amely használ mytype. Ezután mytype átnevezik , és myoldtypeegy új mytype definíciót hoznak létre, ami más definíciójú. A dbo.to_upper függvényt úgy frissítik, hogy az új mytypeimplementációra hivatkozzon a régire helyett.

Az első lépésben hozz létre egy alias típust.

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

Ezután növeld az álnév típus hosszát.

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

CREATE TYPE mytype
    FROM NVARCHAR (10);
GO

A függvényparaméter továbbra is a régi típust használja, és a csorkítás miatt hibázik.

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

Frissítsd a függvényt, hogy a névre átnevezett típushoz kötözzön.

EXECUTE sys.sp_refreshsqlmodule 'dbo.to_upper';

A függvényparaméterek most a megfelelő típushoz vannak kötve, és az utasítás megfelelően működik.

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. Frissítsd meg az adatbázis-szintű DDL triggeret

A következő példa frissíti az adatbázis-szintű DDL triggert.

USE AdventureWorks2022;
GO

EXECUTE sys.sp_refreshsqlmodule
    @name = 'ddlDatabaseTriggerLog',
    @namespace = 'DATABASE_DDL_TRIGGER';
GO

C. Frissítsd fel egy szerverszintű DDL triggeret

A következő példa egy szerverszintű DDL triggert frissít.

USE master;
GO

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