我有一个C# Winform
应用程序,它通过存储过程与SQL Server
DB进行交互。在SSMS中,如何创建仅具有运行存储过程权限的登录名?该登录名将无法查看/编辑/创建表定义等。它也只能访问单个指定的数据库。
之所以要创建这样的登录名,是因为我将Winform应用程序使用的SQL Server凭据存储在其App.config
文件中。由于可以轻松读取app.config,因此,如果给定的登录名具有除存储过程以外的任何其他权限,则具有恶意的任何人都可以轻松地对数据库执行不需要的操作。
答案 0 :(得分:2)
在这种情况下,一个巧妙的技巧是创建一个单独的(自定义)SQL Server角色,该角色只能执行存储过程:
CREATE ROLE db_executor;
GRANT EXECUTE TO db_executor;
此角色现在具有在创建它的数据库中执行任何存储过程的权限-此外:该权限还将扩展到存储的任何 future 您稍后可能会在此数据库中创建的过程。
现在在您的数据库中创建一个用户,并仅授予该数据库角色-该用户将只能执行存储过程-数据库中的所有存储过程。
如果应该允许用户执行任何和所有存储过程-这是一种允许这样做的非常方便的方法(并且在创建新的存储过程时不必不断更新权限)。
答案 1 :(得分:1)
尝试以下方法(每个SP都应重复grant execute
)。请注意,MyStoredProcedure
必须位于MyDatabase
中:)
-- create login to server
create login test_user with password = 'test';
-- create user mapped to a database
use MyDatabase
go
create user test_user for login test_user;
-- grant permission to execute SP
grant execute on MyStoredProcedure to test_user
答案 2 :(得分:1)
您可以使用以下查询来允许存储过程对您的用户执行权限
USE [DB]
GRANT EXECUTE ON dbo.procname TO username;
但是,以我的拙见,您应该在 app.config 中保护连接字符串。 也许,这个How to store login details securely in the application config file链接可以为您提供帮助。
答案 3 :(得分:1)
通过在要用户操作的数据库上创建用户来完成对特定数据库的访问。您可以找到有关用户here的更多信息。
如果创建了用户,则可以对数据库中的每个项目进行Grant
,With Grant
和Deny
操作。
然后,将由 grantor 授予/拒绝用户这些权限,默认情况下为dbo
。
您还可以使用它来拒绝他访问数据库中不是存储过程的每个项目,如果我对您的理解正确的话,这就是您要寻找的内容。