sp_refreshsqlmodule (T-SQL)
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics (khusus kumpulan SQL khusus)
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.
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_refreshsqlmodule
sp_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 Transact-SQL dalam artikel ini menggunakan AdventureWorks2022
database sampel atau AdventureWorksDW2022
, yang dapat Anda unduh dari halaman beranda Sampel Microsoft SQL Server dan Proyek Komunitas.
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 , mytype
bukan 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.
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.
EXEC 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
EXEC 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
EXEC sys.sp_refreshsqlmodule
@name = 'ddl_trig_database',
@namespace = 'SERVER_DDL_TRIGGER';
GO