如何创建只能访问运行存储过程的登录名?

时间:2019-10-08 05:37:44

标签: sql-server ssms

我有一个C# Winform应用程序,它通过存储过程与SQL Server DB进行交互。在SSMS中,如何创建仅具有运行存储过程权限的登录名?该登录名将无法查看/编辑/创建表定义等。它也只能访问单个指定的数据库。

之所以要创建这样的登录名,是因为我将Winform应用程序使用的SQL Server凭据存储在其App.config文件中。由于可以轻松读取app.config,因此,如果给定的登录名具有除存储过程以外的任何其他权限,则具有恶意的任何人都可以轻松地对数据库执行不需要的操作。

4 个答案:

答案 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的更多信息。

如果创建了用户,则可以对数据库中的每个项目进行GrantWith GrantDeny操作。 然后,将由 grantor 授予/拒绝用户这些权限,默认情况下为dbouserManagement in SSMS

您还可以使用它来拒绝他访问数据库中不是存储过程的每个项目,如果我对您的理解正确的话,这就是您要寻找的内容。