2014-09-05 63 views
0

我有一个存储过程:S1.ProcA - S1是模式 - ProcA访问dbo模式中的表dbo.T1。表格处于不同模式时通过存储过程访问表格

我想USER1,以便能够通过S1.ProcA访问dbo.T1 - 我给S1.ProcA EXEC访问权限,但是,它有错误“选择权限被拒绝在dbo.T1 ......”

如何通过proc S1.ProcA将user1的访问权限授予表dbo.T1,而不直接授予对表的访问权限?

谢谢。

+0

SQL Serve 2008数据库。所有的对象都在同一个数据库中。 – user1967701 2014-09-05 19:25:08

+0

解决方案可能是在与过程相同的模式中创建视图,然后授予对视图的访问权限,而不是表格 – 2014-09-05 19:32:43

+0

您也可以尝试存储过程代码中的“EXECUTE AS”子句。 – 2014-09-05 19:37:44

回答

1

您可以使用EXECUTE AS指定运行存储过程的安全上下文的另一个用户。

CREATE PROCEDURE your_proc 
WITH EXECUTE AS 'user_with_permission_on_schema' 
AS SELECT * FROM your_schema.your_table 

所以,如果你有一个登录/用户具有由您可以使用登录/用户执行存储过程,而不是调用者的PROC引用的对象上相应的权限。

如果您想在管理控制台中使用权限,则可以使用EXECUTE AS USER = 'user'REVERT(回到常规登录)命令在测试时更改安全上下文。

SQL Server安全性是一个复杂的话题,我建议你通过documentation仔细阅读,因为这可能不是你想要采取太多的机会在一个地区

是如何工作的一个例子:

-- create schemas, table, users, proc and grant permissions 
CREATE SCHEMA demo_s1 
GO 
CREATE SCHEMA demo_s2 
GO 
CREATE USER [schema_s1_owner] WITHOUT LOGIN WITH DEFAULT_SCHEMA=[demo_s1] 
GO 
CREATE USER [schema_s2_user] WITHOUT LOGIN WITH DEFAULT_SCHEMA=[demo_s2] 
GO 
CREATE TABLE demo_s1.your_table (column1 int) 
INSERT demo_s1.your_table VALUES (1),(2),(3) 
GO 
GRANT SELECT ON demo_s1.your_table TO [schema_s1_owner] 
GO 
CREATE PROCEDURE select_from_s1_your_table 
WITH EXECUTE AS 'schema_s1_owner' 
AS SELECT * FROM demo_s1.your_table 
GO 
GRANT EXECUTE ON select_from_s1_your_table TO [schema_s2_user] 
GO 

-- try executing as limited user 
EXECUTE AS USER = 'schema_s2_user' -- change security context 
SELECT * FROM demo_s1.your_table -- this will fail with 'SELECT permission was denied' 
GO 
EXEC select_from_s1_your_table -- this will work and return results 
GO 
REVERT -- go back to the ordinary login and clean up 
GO 

-- clean up 
DROP TABLE demo_s1.your_table 
GO 
DROP PROC select_from_s1_your_table 
GO 
DROP USER [schema_s2_user] 
GO 
DROP USER [schema_s1_owner] 
GO 
DROP SCHEMA demo_s1 
GO 
DROP SCHEMA demo_s2 
GO 
+0

谢谢我将执行EXECUTE AS – user1967701 2014-09-05 20:09:39

+0

@ user1967701我添加了一个示例脚本来演示如何工作。该脚本添加了一些东西,然后将其删除。 – jpw 2014-09-05 20:15:31