2016-02-26 20 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' 
相关问题