sp_refreshsqlmodule (T-SQL)
Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics (khusus kumpulan SQL)
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.
Sintaks
sys.sp_refreshsqlmodule [ @name = ] 'module_name'
[ , [ @namespace = ] ' <class> ' ]
<class> ::=
{
| DATABASE_DDL_TRIGGER
| SERVER_DDL_TRIGGER
}
Argumen
@name
Adalah nama prosedur tersimpan, fungsi yang ditentukan pengguna, tampilan, pemicu DML, pemicu DDL tingkat database, atau pemicu DDL tingkat server. module_name tidak boleh menjadi prosedur tersimpan runtime bahasa umum (CLR) atau fungsi CLR. module_name tidak boleh terikat skema. module_name adalah nvarchar, tanpa default. module_name bisa menjadi pengidentifikasi multi-bagian, tetapi hanya dapat merujuk ke objek dalam database saat ini.
@namespace
Adalah kelas modul yang ditentukan. Ketika module_name adalah pemicu DDL, <kelas> diperlukan. <kelas> adalah nvarchar(20). Input yang valid adalah:
DATABASE_DDL_TRIGGER
SERVER_DDL_TRIGGER - Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.
Mengembalikan Nilai Kode
0 (berhasil) atau angka bukan nol (kegagalan)
Keterangan
Prosedur sp_refreshsqlmodule
tersimpan sistem harus dijalankan ketika perubahan dilakukan pada objek yang mendasari modul yang memengaruhi definisinya. Jika tidak, modul mungkin menghasilkan hasil yang tidak terduga ketika dikueri atau dipanggil. Untuk me-refresh tampilan, Anda dapat menggunakan atau sp_refreshsqlmodule
sp_refreshview
dengan hasil yang sama.
sp_refreshsqlmodule
tidak memengaruhi izin apa pun, properti yang diperluas, atau opsi SET 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
Memerlukan izin UBAH pada modul dan izin REFERENSI pada jenis yang ditentukan pengguna CLR dan koleksi skema XML yang direferensikan oleh objek. Memerlukan izin UBAH PEMICU DDL DATABASE APA PUN dalam database saat ini ketika modul yang ditentukan adalah pemicu DDL tingkat database. Memerlukan izin CONTROL SERVER ketika modul yang ditentukan adalah pemicu DDL tingkat server.
Selain itu, untuk modul yang didefinisikan dengan klausul EXECUTE AS, izin IMPERSONATE diperlukan pada prinsipal yang ditentukan. Umumnya, me-refresh objek tidak mengubah prinsipal EXECUTE AS-nya, kecuali modul didefinisikan dengan EXECUTE AS USER dan nama pengguna prinsipal sekarang diselesaikan ke pengguna yang berbeda dari pada saat modul dibuat.
Contoh
J. Menyegarkan 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 baru mytype
dibuat yang memiliki definisi berbeda. Fungsi dbo.to_upper
ini di-refresh sehingga mereferensikan implementasi baru , mytype
bukan yang lama.
-- Create an alias type.
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
-- Increase the length of the alias type.
sp_rename 'mytype', 'myoldtype', 'userdatatype';
GO
CREATE TYPE mytype FROM nvarchar(10);
GO
-- The function parameter still uses the old type.
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 the function to bind to the renamed type.
EXEC sys.sp_refreshsqlmodule 'dbo.to_upper';
-- The function parameters are now bound to the correct type and the statement works correctly.
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
EXEC sys.sp_refreshsqlmodule @name = 'ddlDatabaseTriggerLog' , @namespace = 'DATABASE_DDL_TRIGGER';
GO
C. Menyegarkan pemicu DDL tingkat server
Contoh berikut me-refresh pemicu DDL tingkat server.
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.
USE master;
GO
EXEC sys.sp_refreshsqlmodule @name = 'ddl_trig_database' , @namespace = 'SERVER_DDL_TRIGGER';
GO
Langkah berikutnya
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk