今天在公司SQL Server數據庫中,查到一個SQL Server用戶賬號"DemoUser":
"DemoUser"不在數據庫服務器的sysadmin角色中:
"DemoUser"在數據庫"TestDB"中做了用戶映射,映射后的數據庫賬號也叫"DemoUser",其默認SCHEMA為"dbo":
"DemoUser"在數據庫"TestDB"中不擁有任何SCHEMA:
"DemoUser"在數據庫"TestDB"中沒有db_owner權限:
但是奇怪的是,"DemoUser"連接到數據庫"TestDB"后,居然可以執行src這個SCHEMA下的存儲過程"[src].[SP_ShowUsers]":
這就很奇怪了,為什么SQL Server賬號"DemoUser"並不是數據庫服務器管理員(sysadmin),也沒有數據庫"TestDB"的db_owner權限,也不擁有src這個SCHEMA,卻可以成功執行"EXEC [src].[SP_ShowUsers]",這個存儲過程?
后來我才發現原來"DemoUser"擁有數據庫"TestDB"的EXECUTE權限:
我們可以看到默認情況下,上面這張窗口截圖中,左邊Securables選項點開后右邊列表為空,我們可能就會認為"DemoUser"沒有數據庫"TestDB"的任何權限啊?
其實不然,我們點擊右上角的Search按鈕:
然后選擇All objects of the types:
然后將Databases勾上:
這時我們就會發現窗口列表中,出現了用戶"DemoUser"在數據庫"TestDB"中擁有的權限,其中在窗口下面的Explicit選項卡中,我們可以看到"DemoUser"擁有數據庫"TestDB"的EXECUTE權限:
窗口下面的Effective選項卡(Effective選項卡的內容,會受到很多因素的影響,例如:SQL Server賬號在數據庫服務器的角色(Server Roles),SQL Server賬號在單個數據庫的權限(Membership),在上面截圖中Explicit選項卡中的權限等)也會列出"DemoUser"擁有的權限,其中就有EXECUTE權限:
而數據庫"TestDB"的EXECUTE權限,也可以用下面的SQL語句賦予用戶"DemoUser":
USE [TestDB] GRANT EXECUTE TO [DemoUser]
只要SQL Server賬號擁有了數據庫的EXECUTE權限,那么該賬號就可以在對應的數據庫上執行存儲過程,這也是為什么本文中SQL Server賬號"DemoUser"可以在數據庫"TestDB"中執行存儲過程的原因。
所以影響一個SQL Server賬號行為的因素很多,而賬號所擁有SQL Server數據庫的權限就是其中一個很重要的因素。