Sql-Server

SQL Server LockMatchID 命令

  • November 12, 2019

我在我的 SQL Server 審核日誌中看到如下所示的呼叫,但不知道這意味著什麼。Google搜尋發現與編譯/重新編譯的可能關係。該行(或類似行)也可以在多個 SQL Server 內部儲存過程中找到。

 EXEC %%Object(MultiName = @objname).LockMatchID(ID = @objid, Exclusive = 1, BindInternal = 0)

有人了解這個過程嗎?

它是一種內部方法,大概 - 從名稱來看 - 用於根據其鎖定對象object_id並確保執行使用者有權對對象進行進一步更改。這種鎖定是執行添加/刪除屬性、隱藏列等操作所必需的,並確保對像在此期間不會被其他人刪除或更改(普通人傾向於通過啟動事務和鎖定來做到這一點該表通過一些間接方法,因為沒有LOCK TABLE命令 - 但顯然有內部管道來幫助系統操作)。

如果您查看使用它的任何程序(有一個很大的列表):

SELECT N'EXEC sp_helptext ''sys.' + QUOTENAME(name) + N''';' 
FROM sys.all_objects 
WHERE [schema_id] = 4
 AND LOWER(OBJECT_DEFINITION([object_id])) LIKE N'%lockmatchid%';

您會看到前面的評論,例如:

-- Lock the table schema and check permissions

-- Share lock default so it cannot be dropped

-- Since binding a default is a schema change, update schema count
--  for the object in the sysobjects table.

-- Ex-lock and check permission

-- Share Lock rule so that it cannot be dropped

-- Check that table and column exist

-- RESOLVE OBJECT NAME

-- Get exclusive object lock upfront so subsequent %%ColumnEx can proceed

-- Acquire sch-M lock up-front on the published object 

-- LOCK PROC & CHECK PERMISSION --

-- LOCK, CHECK PERMISSION, BUMP SCHEMA FOR RECOMPILE  --

-- obtain owner-qual object name

-- Re-acquire schema mod lock to make the code more resilient to changes
-- although this must have been done inside sp_Mrepl_schema

-- LOCK TABLE, CHECK STANDARD TABLE-DDL PERMISSIONS

-- Since binding a default is a schema change,
--  update schema count for the object in the sysobjects table.

-- Update schema count for the object in the sysobjects table.

-- Verify that table exists

(人們說評論程式碼是浪費時間。)

似乎也有LockExclusiveMatchID方法,儘管Exclusive參數似乎後來被添加到LockMatchID​​ ,這使得獨占方法過時了。

不確定您需要更具體多少 - 如果您想追踪這些高發生率的位置,您需要查看外部呼叫,而不是這個特定的語句。例如,您是否有一個應用程序正在重命名對象,或者sp_autostats直接呼叫、更改複製,或者您可以從上面生成的列表中推斷出的任何其他內容?您必須弄清楚呼叫了哪些程序來幫助確定原因。並且您將對此做什麼(如果您甚至可以確定存在“問題”)將與LockMatchID具體無關。

引用自:https://dba.stackexchange.com/questions/115655