Bagikan melalui


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.

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_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 , 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.

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