避免我的理解錯誤,先確認下我們的認知是否相同
我們在作SQL Server上的物件存取時,完整的指令會這樣下:
Select * from [Server_Name].[DB_Name].[Owner].[Object]
您問題中提到的proc就是上面指令的[Owner]嗎?
如果是,那您新建一個帳號並給予proc權限,要讀取proc下的物件應該是沒有問題,不過若是跨DB的物件,則要先確認您現行proc帳號是否可以正常存取這些跨DB的物件。如果不行存取,那您要先解決這些跨DB物件的權限問題。
您好:
一般用 dbo 這一個
我建立一個 create proc xx_proc
as Select * from [Server_Name].[DB_Name].[Owner].[Object]
然後建立一個 燈入帳號 ACT
並授予 ACT 有 執行 xx_proc 的權力
但沒有授予 ACT 的 DB_Name].[Owner].[Object] select 權限
這樣執行xx_proc 時,是否會因為 沒有TABLE,FUNCTION 的權限,就無法執行?
若是這樣,一個proc 內含多個 TABLE,FUNCTION
就得逐一開放權限?
謝謝
資料庫的權限控管設計是很嚴謹的,沒有權限就不能讀取到資料是最基本的要求。所以您想的沒有錯,若Stored Procedure裡有用到沒有權限的物件是會報錯的。
如果用到這個SP的人很多,您也可以建一個專用帳號設好權限,讓其他使用者可以用EXECUTE AS指令來執行這支SP,使用方法請參閱連結:EXECUTE AS (Transact-SQL)
您好:
謝謝!
應該是說,ACT帳號,我是要拿來做批次執行的帳號
會將他寫在C# 中。
ACT帳號
|--執行一個主要proc_M,只有2個TABLE 關聯起來
|--proc_M撈出的資料, 會組合成語法,執行其他PROC_D
|---PROC_D1 ,不同TABLE
|---PROC_D2 ,不同TABLE
所以,若要一個一個針對有用到的TABLE 來授權,蠻多的
又不想 用原來較高權限等級 DBWONER 帳號owner,放在C#內。
所以才會享有方式較好。
若是用 execute as,那要
GRANT IMPERSONATE ON USER:: owner TO ACT;
用ACT登錄
EXECUTE AS USER = 'owner';
exec proc_M
這樣嗎?
謝謝
登入帳號USER1有Stored Procedure sp_test的權限
sp_test裡有使用到 TABLE1 和 VIEW1 和 FUN1
那 TABLE1 和 VIEW1 和 FUN1 的權限都需要開給USER1