我有一个应用程序,用户可以在其中输入要在 sql server 数据库中执行的 sql 语句。这些语句只能返回数据,不能执行任何 DML 或 DDL 操作。目前输入被验证只允许写 SELECT 语句。但现在是要求允许执行存储过程,但仅限那些只读数据的。也将有助于列出这些 SP 以显示一种智能感知。
我想创建一个只有 db_datareader 权限的用户并以此用户身份执行语句。但是要执行存储过程,我必须向用户授予执行权限,因为 Ownership Chaining ,可能不会检查权限。我还没有想出如何解决这个问题。
我还认为只允许执行在特定数据库模式中创建的存储过程,该模式只有读取权限。这样我也可以轻松列出 SP。我不知道这是否可能。
最佳答案
But to execute an stored procedure I must grant Execute permission to the user
这应该通过创建一个没有登录的用户并仅向该登录授予选择来工作。这使用 EXECUTE as 子句。您需要 EXECUTE 作为创建或调用此模块的权限,但是执行上下文将是 user1,一旦你是在只有选择权限的模块中
create user user1 without login
grant select to user1
alter proc usp_test
@sql nvarchar(max)
with execute as 'user1'
as
begin
exec sp_Executesql @sql
end
create table dbo.test
(
id int
)
insert into test
select 1
go 10
exec usp_test N'select * from test' --works
exec usp_test N'insert into test values(1)' --fails with below error
Msg 229, Level 14, State 5, Line 28 The INSERT permission was denied on the object 'test', database 'master', schema 'dbo'.
关于c# - Sql server - 以只读权限执行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45084735/