Bagikan melalui


sp_refreshsqlmodule (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (hanya kumpulan SQL khusus)Database SQL di Microsoft Fabric

Memperbarui metadata untuk prosedur tersimpan yang tidak terikat skema yang ditentukan, fungsi yang ditentukan pengguna, tampilan, pemicu DML, pemicu DDL tingkat database, atau pemicu DDL tingkat server dalam database saat ini. Metadata persisten untuk objek ini, seperti jenis data parameter, dapat menjadi kedaluarsa karena perubahan pada objek yang mendasarnya. Misalnya, Anda mungkin melihat kesalahan seperti The definition for user-defined data type 'typename' has changed. Merefresh metadata untuk modul yang menggunakan jenis yang ditentukan dalam kesalahan mungkin menyelesaikan masalah.

Konvensi sintaks transact-SQL

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

Argumen

[ @name = ] N'name'

Nama prosedur tersimpan, fungsi yang ditentukan pengguna, tampilan, pemicu DML, pemicu DDL tingkat database, atau pemicu DDL tingkat server. @name adalah nvarchar(776), tanpa default. @name tidak dapat menjadi prosedur tersimpan common language runtime (CLR) atau fungsi CLR. @name tidak boleh terikat skema. @name bisa menjadi pengidentifikasi multi-bagian, tetapi hanya dapat merujuk ke objek dalam database saat ini.

[ @namespace = ] N'namespace'

Kelas modul yang ditentukan. @namespace adalah nvarchar(20), dengan default OBJECT. Saat @name adalah pemicu DDL, @namespace diperlukan. Input yang valid adalah DATABASE_DDL_TRIGGER dan SERVER_DDL_TRIGGER.

Mengembalikan nilai kode

0 (berhasil) atau angka bukan nol (kegagalan).

Keterangan

sp_refreshsqlmodule harus dijalankan ketika perubahan dilakukan pada objek yang mendasari modul yang memengaruhi definisinya. Jika tidak, modul mungkin menghasilkan hasil yang tidak terduga saat dikueri atau dipanggil. Untuk me-refresh tampilan, Anda dapat menggunakan atau sp_refreshsqlmodulesp_refreshview dengan hasil yang sama.

sp_refreshsqlmodule tidak memengaruhi izin apa pun, properti yang diperluas, atau SET opsi yang terkait dengan objek.

Untuk me-refresh pemicu DDL tingkat server, jalankan prosedur tersimpan ini dari konteks database apa pun.

Catatan

Tanda tangan apa pun yang terkait dengan objek dihilangkan saat Anda menjalankan sp_refreshsqlmodule.

Izin

ALTER Memerlukan izin pada modul dan REFERENCES izin pada jenis yang ditentukan pengguna CLR dan koleksi skema XML yang direferensikan oleh objek. ALTER ANY DATABASE DDL TRIGGER Memerlukan izin dalam database saat ini ketika modul yang ditentukan adalah pemicu DDL tingkat database. CONTROL SERVER Memerlukan izin ketika modul yang ditentukan adalah pemicu DDL tingkat server.

Selain itu, untuk modul yang didefinisikan dengan EXECUTE AS klausul, IMPERSONATE izin diperlukan pada prinsipal yang ditentukan. Umumnya, me-refresh objek tidak mengubah prinsipalnya EXECUTE AS , kecuali modul didefinisikan dengan EXECUTE AS USER dan nama pengguna prinsipal sekarang diselesaikan ke pengguna yang berbeda dari pengguna pada saat modul dibuat.

Contoh

Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.

J. Merefresh fungsi yang ditentukan pengguna

Contoh berikut me-refresh fungsi yang ditentukan pengguna. Contoh membuat jenis data alias, mytype, dan fungsi yang ditentukan pengguna, to_upper, yang menggunakan mytype. Kemudian, mytype diganti namanya menjadi myoldtype, dan yang baru mytype dibuat yang merupakan definisi yang berbeda. Fungsi dbo.to_upper ini di-refresh sehingga mereferensikan implementasi baru , mytypebukan yang lama.

Pada langkah pertama, buat jenis alias.

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

Selanjutnya, tingkatkan panjang jenis alias.

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

CREATE TYPE mytype
    FROM NVARCHAR (10);
GO

Parameter fungsi masih menggunakan jenis lama, dan gagal karena pemotongan.

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

Refresh fungsi untuk mengikat ke jenis yang diganti namanya.

EXECUTE sys.sp_refreshsqlmodule 'dbo.to_upper';

Parameter fungsi sekarang terikat ke jenis yang benar dan pernyataan berfungsi dengan benar.

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. Merefresh pemicu DDL tingkat database

Contoh berikut me-refresh pemicu DDL tingkat database.

USE AdventureWorks2022;
GO

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

C. Merefresh pemicu DDL tingkat server

Contoh berikut me-refresh pemicu DDL tingkat server.

USE master;
GO

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