日前幫同仁建了一張View去Select Linked Server中的一張資料表,建立完成後我就試著去查詢該View,此時SQL卻報出2557的錯誤訊息。該訊息內容就是我沒有DBCC SHOW_STATISTICS該資料表的權限。
我第一次看到這個訊息,首先想說會是Linked Server連接設定的問題嗎?重新檢查一遍並無異常。但我並沒有對該表下DBCC SHOW_STATISTICS的語法啊,我只是單純Select而已,為何會報這錯誤呢?
此時我改用Openquery的方式來Select該遠端資料表是OK的,但用4階式的方式就是會報錯。後來我突然想到該資料表有部分欄位有設定動態資料遮罩,會是這個原因導致嗎? 因此我授於帳號UnMask權限後發現SQL不會報出2557的錯誤了。
因此我來做個簡易的測試模擬我遇到的狀況,如下圖所示我建立一張資料表Membership然後部分欄位啟用Mask功能。
我們建立一個帳號並授權該帳號可以Select Membership資料表,但該帳號並沒有Unmask權限,因此我們可以看到rock看到的資料是有遮罩過。
下圖中我在Membership資料表建立一個索引後,改用rock帳號去DBCC SHOW_STATISTICS該資料表的統計狀態,此時SQL報出2557的錯誤訊息了(如下圖藍色圈選處)。
此時我授予rock帳號Unmask權限後重新DBCC SHOW_STATISTICS該資料表的統計狀態就可以正常取得資料。
完成上面簡易測試後可以知道一旦該資料表有建立動態遮罩,沒有Unmask的帳號都無權限對該資料表做DBCC SHOW_STATISTICS。
但我只是對Linked Server的資料表做Select而已,這關DBCC SHOW_STATISTICS甚麼事啊! 重點就是透過Linked Server對遠端查詢時,SQL的引擎會根據需求去遠端查詢該資料表的統計資訊,並做為執行計畫的統計參考。下圖中我就建立一個Linked Server,可以查詢Membership資料表。
下圖顯示我們可以透過4階式查詢順利查到資料。
當SQL的引擎根據需求去遠端查詢該資料表的統計時會去Call [sp_table_statistics2_rowset] 這一個SP,而該SP中就有用到DBCC SHOW_STATISTICS這句語法。因此當該SP跑到這句語法後就會報出2557的錯誤了,下圖就是模擬SQL用[sp_table_statistics2_rowset]去要統計資料時會遇到的錯誤。
下圖為官方文件中對於DBCC SHOW_STATISTICS的權限說明,其中一項就是該表如果有動態資料遮罩時會有權限上的問題了。
我是ROCK
rockchang@mails.fju.edu.tw