c# - Sql server - 以只读权限执行存储过程

标签 c# sql-server

我有一个应用程序,用户可以在其中输入要在 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/

相关文章:

sql - 从数据库获取值时出错

sql-server - 从 XML 中选择使用逗号作为小数点分隔符的十进制数

c# - 在 WCF 服务上启用 CORS。获取 HTTP 405 : Method Not Allowed

c# - Duende 身份服务器 6 中的 redirect_uri 无效

c# - 配置 ASP.NET Core gRPC 以在服务器和客户端上使用 SSL/TLS

SQL - 从字符串转换日期和/或时间时出错

javascript - 未处理的 promise 拒绝在哪里?我怎样才能避免它?

sql - 谁被叫了?

c# - 如何设置 LUISDialog 转到 .NET 中的“无意图”的最小阈值?

c# - 对象不能从 DBNull 转换为其他类型