Delen via


sp_refreshsqlmodule (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (alleen toegewezen SQL-pool)SQL-database in Microsoft Fabric

Werkt de metadata bij voor de gespecificeerde niet-schema-gebonden stored procedure, door de gebruiker gedefinieerde functie, view, DML-trigger, databaseniveau DDL-trigger of serverniveau DDL-trigger in de huidige database. Persistente metadata voor deze objecten, zoals datatypes van parameters, kan verouderd raken door veranderingen in hun onderliggende objecten. Je kunt bijvoorbeeld een fout zien zoals The definition for user-defined data type 'typename' has changed. Het verversen van de metadata voor de module die het type gebruikt dat in de fout is gespecificeerd, kan het probleem oplossen.

Transact-SQL syntaxis-conventies

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

Arguments

[ @name = ] Naamloos

De naam van de opgeslagen procedure, door de gebruiker gedefinieerde functie, weergave, DML-trigger, DDL-trigger op databaseniveau of DDL-trigger op serverniveau. @name is nvarchar(776), zonder standaardinstelling. @name kan geen opgeslagen procedure (COMMON Language Runtime) of een CLR-functie zijn. @name kan geen schemagebonden zijn. @name kan een meervoudige id zijn, maar kan alleen verwijzen naar objecten in de huidige database.

[ @namespace = ] N'naamruimte'

De klasse van de opgegeven module. @namespace is nvarchar(20), met een standaardwaarde van OBJECT. Wanneer @name een DDL-trigger is, is @namespace vereist. Geldige invoeren zijn DATABASE_DDL_TRIGGER en SERVER_DDL_TRIGGER.

Codewaarden retourneren

0 (geslaagd) of een niet-nulnummer (fout).

Opmerkingen

sp_refreshsqlmodule moet worden uitgevoerd wanneer er wijzigingen worden aangebracht aan de objecten die de module onderliggen en de definitie ervan beïnvloeden. Anders kan de module onverwachte resultaten opleveren wanneer deze wordt geraadpleegd of aangeroepen. Om een weergave te verversen kun je beide sp_refreshsqlmodule gebruiken, met sp_refreshview hetzelfde resultaat.

sp_refreshsqlmodule heeft geen invloed op machtigingen, uitgebreide eigenschappen of SET opties die aan het object zijn gekoppeld.

Als u een DDL-trigger op serverniveau wilt vernieuwen, voert u deze opgeslagen procedure uit vanuit de context van een database.

Opmerking

Handtekeningen die aan het object zijn gekoppeld, worden verwijderd wanneer u sp_refreshsqlmodule uitvoert.

Permissions

Vereist ALTER machtigingen voor de module en REFERENCES machtigingen voor door de gebruiker gedefinieerde CLR-typen en XML-schemaverzamelingen waarnaar wordt verwezen door het object. Vereist ALTER ANY DATABASE DDL TRIGGER toestemming in de huidige database wanneer de gespecificeerde module een databaseniveau DDL-trigger is. Vereist CONTROL SERVER toestemming wanneer de gespecificeerde module een serverniveau DDL-trigger is.

Daarnaast is voor modules die met de EXECUTE AS clausule zijn gedefinieerd, IMPERSONATE toestemming vereist voor het gespecificeerde principe. Over het algemeen verandert het verversen van een object zijn EXECUTE AS principal niet, tenzij de module is gedefinieerd met EXECUTE AS USER en de gebruikersnaam van de principal nu wordt opgesloten op een andere gebruiker dan de gebruiker op het moment dat de module werd gemaakt.

Voorbeelden

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

Eén. Ververs een door de gebruiker gedefinieerde functie

Het volgende voorbeeld verst een door de gebruiker gedefinieerde functie. Het voorbeeld creëert een alias-datatype, mytype, en een door de gebruiker gedefinieerde functie, to_upper, die gebruikmaakt van mytype. Vervolgens wordt hernoemd mytype naar myoldtype, en wordt er een nieuwe mytype aangemaakt die een andere definitie heeft. De dbo.to_upper functie wordt vernieuwd zodat deze verwijst naar de nieuwe implementatie van mytype, in plaats van de oude.

In de eerste stap maak je een aliastype.

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

Vergroot vervolgens de lengte van het aliastype.

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

CREATE TYPE mytype
    FROM NVARCHAR (10);
GO

De functieparameter gebruikt nog steeds het oude type en faalt door afkaping.

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

Ververs de functie om te binden naar het hernoemde type.

EXECUTE sys.sp_refreshsqlmodule 'dbo.to_upper';

De functieparameters zijn nu gebonden aan het juiste type en de instructie werkt correct.

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. Ververs een databaseniveau DDL-trigger

Het volgende voorbeeld ververst een databaseniveau DDL-trigger.

USE AdventureWorks2022;
GO

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

C. Ververs een serverniveau DDL-trigger

Het volgende voorbeeld ververst een serverniveau DDL-trigger.

USE master;
GO

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