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.

Konvensi sintaks transact-SQL

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_refreshsqlmodulesp_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 , mytypebukan 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