为SQL Server数据库用户授予角色以创建用户和grant / alter角色,但限制更改db对象

时间:2017-08-29 06:19:32

标签: sql-server database user-roles

我们的应用程序需要两种类型的用户(每个应用程序用户都需要自己的凭据才能访问数据库)

  1. 管理
  2. 一般用户
  3. 我们创建了一个具有以下权限的用户General User

    1. 可以浏览存储过程/函数,但不允许查看
    2. 中的代码
    3. 只能选择表,但不允许在存储过程执行之外插入/更新/删除
    4. 我创建了一个角色,并为其添加了General User

      CREATE ROLE proc_executor
      
      GRANT EXECUTE TO proc_executor
      GRANT SELECT  TO proc_executor
      

      现在我需要具有以下权限的Admin角色:

      1. 保留General User的所有角色,已经可用
      2. 创建新用户,包括db和server
      3. 更改新用户的角色
      4. Admin有一些限制。它们只能执行存储过程并从表中进行选择。

        我研究过,人们建议添加db_accessadmindb_securityadminsp_addrolemember(未找到)等角色,这不足以创建新用户并同时打破限制。

        允许创建用户权限并同时限制漫步存储过程代码似乎很棘手。 SA持有我们的权限,我们不允许客户端使用数据库。

        任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

为什么不单独创建应用程序的安全架构。您可以拥有以下表格:

-- storing users details
CREATE [dbo].[SecurityUsers] TABLE
(
    [SecurityUserID] BIGINT
   ,...
   ,...
);

-- storing groups details
CREATE [dbo].[SecurityGroups] TABLE
(
    [SecurityGroupID] INT
   ,[SecurityGroupName] NVARCHAR(128)
   ,[SecurityGroupDescription] NVARCHAR(1024)
);

-- storing group-users mapping
CREATE [dbo].[SecurityGroupsMembership]
(
    [SecurityGroupID] INT
   ,[SecurityUserID] BIGINT
);

你可以在函数或存储过程的乞讨时写一个security check,如下所示:

if user is not member of `update data`
begin;
    return;
end;

SQL Server 2016 SP1中,您甚至可以使用row-level security在表SELECT上映射此类安全功能。

您的结构可能更复杂 - 您可以表安全策略或/和安全角色。您需要添加一个接口(可能)来设置用户权限/成员资格。