首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 重新命名函數/預存程序導致 sys.all_sql_modules 定義不同步問題

     編輯:關於SqlServer

現象重現

  1. 建立函數 dbo.ufn_test_1。
  2. SSMS 物件總管右鍵「重新命名」為 dbo.ufn_test_2。
  3. 執行 sp_helptext ufn_test_2 或查 sys.all_sql_modules,定義內容仍為舊名稱 ufn_test_1。

重命名前定義正常

重命名後定義不同步

根因

SSMS「重新命名」實際執行 sp_rename,僅更新 sys.objects.name,不更新 sys.sql_modules.definition 中的原始碼文字。編譯後的計畫快取已為新名稱,但元資料定義殘留舊名,導致:

  • sp_helptext、OBJECT_DEFINITION 顯示舊名。
  • 匯出腳本、版本控管、跨環境部署時攜帶舊名,造成建立失敗或邏輯錯誤。

解決方案

  1. 重建物件:DROP FUNCTION ...; CREATE FUNCTION 新名稱 ...(最乾淨)。
  2. 使用 SSMS「修改」或「指令碼建立」:右鍵 → 「修改」→ 更改名稱 → 執行,或「指令碼預存程序為」→ 「建立」→ 修改名稱執行,均會同步更新 definition。
  3. 預存程序同理:sp_rename 同樣不更新 definition,同樣需重建或用「修改」方式。

最佳實踐建議

  • 避免重新命名:命名規範前置(如 usp_, ufn_),變更需求直接重建。
  • 若必須改名且資料量大(表),使用 sp_rename 後同步執行 sp_refreshsqlmodule(僅刷新相依物件,不修正 definition),仍建議重建。
  • 自動化部署腳本請直接輸出 CREATE OR ALTER(SQL 2016+)或 DROP + CREATE,勿依賴 sp_rename。

驗證腳本

SELECT OBJECT_ID('dbo.ufn_test_2') AS obj_id, *
FROM sys.all_sql_modules
WHERE [object_id] = OBJECT_ID('dbo.ufn_test_2');

若 definition 含舊名,立即重建。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved