2016-02-26 50 views
1

我想創建一個存儲過程SP1這將有腳本從sys模式獲取數據。但是,此存儲過程將通過沒有對sys架構權限誰的用戶調用。我怎樣才能做到這一點?用戶可以訪問存儲過程,而不是底層代碼直接

我這樣做基本上是從用戶掩蓋整個sys模式,但同時也讓他看到最小的信息。

基本上,我想這裏面SP

--Displays Object information 
SELECT m.object_id [ObjID] 
     ,o.type_desc [ObjType] 
     ,o.name [ObjectName] 
     ,e.last_execution_time [LastExecutedOn] 
     ,create_date [CreatedOn] 
     ,modify_date [ModifiedOn] 
     , DEFINITION [Data] 
FROM sys.SQL_MODULES m 
JOIN sys.OBJECTS o 
ON m.object_id=o.object_id 
LEFT JOIN sys.dm_exec_procedure_stats e 
ON e.object_id=o.object_id 
WHERE DEFINITION LIKE '%'[email protected]+'%' 
ORDER BY o.name 
+0

會發生什麼事,如果你授予執行訪問SP,僅此而已? – jarlh

+0

SP可供該用戶訪問。但是當他運行它時,他會得到錯誤消息,說您沒有訪問sys對象的權限。 基本上我想這裏面SP --Displays對象信息 SELECT m.object_id [ObjID的] \t \t,o.type_desc [OBJTYPE] \t \t,o.name [對象名] \t \t,例如last_execution_time [LastExecutedOn] \t \t,CREATE_DATE [CreatedOn] \t \t,modify_date [ModifiedOn] \t \t,DEFINITION [數據] FROM sys.SQL_MODULES中號 JOIN sys.objects中ö ON m.object_id = o.object_id LEFT JOIN sys.dm_exec_procedure_statsË ON e.object_id = o.object_id WHERE DEFINITION LIKE '%' + @字符串searchstr + '%' ORDER BY o.name –

+1

...你爲什麼要這樣做?你想解決什麼樣的大圖片問題?你想要保護什麼?一般來說'sys'是管理員/開發者的領域 - 對於其他人來說,他們根本不需要看到它。如果有人具有讀取數據庫的REST訪問,他們可以得到大部分的DB佈局反正....並且在常規表中的數據通常比佈局記錄更有價值。你可能尋找['EXECUTE AS'(https://msdn.microsoft.com/en-us/library/ms188354(V = SQL.100)的.aspx),雖然我不能肯定所有的後果。 –

回答

0

我相信你可以用一個視圖,而不是一個SP實現這一目標,按照this問題。

如果您需要能夠傳遞一個參數,以及爲您@SearchStr變量,你可以創造出相應的查詢視圖的SP。所以,你的觀應該是:

CREATE VIEW vwObjectInfo 
AS 
    SELECT m.OBJECT_ID [ObjID], 
      o.type_desc [ObjType], 
      o.name [ObjectName], 
      e.last_execution_time [LastExecutedOn], 
      create_date [CreatedOn], 
      modify_date [ModifiedOn], 
      [definition] [Data] 
    FROM sys.SQL_MODULES m 
    JOIN sys.OBJECTS o ON m.OBJECT_ID = o.OBJECT_ID 
    LEFT JOIN sys.dm_exec_procedure_stats e ON e.OBJECT_ID = o.OBJECT_ID 

和你的SP將是:

CREATE PROCEDURE spSearchObjectInfo 
    @SearchStr NVARCHAR(MAX) 
AS 
BEGIN 
    SELECT * FROM vwObjectInfo 
    WHERE Data LIKE '%' + @SearchStr + '%' 
    ORDER BY ObjectName 
END 

那麼你的用戶應該能夠調用SP與他們期望的搜索字符串,並與剛進行選擇的能力得到結果從視圖和執行SP,就像這樣:

EXEC spSearchObjectInfo 'Some Search String' 
相關問題