【问题标题】:SQL Insert based on role基于角色的 SQL 插入
【发布时间】:2013-05-01 14:36:30
【问题描述】:

我有一个包含 3 个表的数据库:

表 1(部门)- 这是一个包含部门和部门 ID 列的表

表 2 (SecurityMap) - 这是一个将角色名称映射到部门 ID 的表

表 3(客户信息)- 这是根据用户的角色成员身份向用户显示的信息

我拥有所有基于角色功能的 SELECT。

我需要弄清楚如何根据用户角色成员身份,在默认情况下将特定值插入表 3 中的 DepartmentID 列。例如,当有人向数据库添加新行时——除了他们在“添加”表单中提供的数据之外,我还需要在该列中插入一个默认值。如果他们是营销角色的成员,则应该是 1,如果他们是 IT 角色的成员,则应该是 2,等等...

理想情况下,这将在用户不知道它正在发生的情况下完成。我会假设我需要使用“Instead Of”触发器,但我不知道如何继续......

【问题讨论】:

  • 您是否有一个表格,例如,将 Marketing 映射到 Id 1,将 IT 映射到 Id 2?

标签: sql security insert key default


【解决方案1】:

应该不会太难:

  1. 在您的应用中,跟踪登录用户及其角色。
  2. 当您的应用保存客户数据时,请确保它向数据库传递角色 ID 以及用户输入的数据(此处最好使用存储过程)
  3. 当数据库处理提供的数据时,它会将角色 ID 保存到相应的列中。

【讨论】:

    【解决方案2】:

    如果角色名称列(或 id)在 securityMap 表中是唯一的,这应该可以工作,否则选择可能会返回多个值,也许您需要选择不同的部门 ID。

    insert into customer_info(otherdata, departmentId) values('data', (select departmentId from securityMap where rolename = 'userrole'))
    

    编辑:

    既然你提到了 db_owner 也许这可以帮助你(来自http://www.sqlservercentral.com/Forums/Topic411310-338-1.aspx

    WITH CTE_Roles (role_principal_id)
    AS
    (
    SELECT role_principal_id 
    FROM sys.database_role_members
    WHERE member_principal_id = USER_ID()
    UNION ALL
    SELECT drm.role_principal_id
    FROM sys.database_role_members drm
      INNER JOIN CTE_Roles CR
        ON drm.member_principal_id = CR.role_principal_id
    )
    SELECT USER_NAME(role_principal_id) RoleName
    FROM CTE_Roles
    ORDER BY RoleName;
    

    您可以将其与 SecurityMap-table 结合起来以过滤掉像 db_owner 这样的角色

    【讨论】:

    • 虽然这将获得特定角色的正确 ID,但问题并未解决。该角色将是动态的,基于谁登录。除此之外,虽然用户将只是其中一个特定角色的一部分,但他们也可能是 db_owner 角色的一部分。不过,我确实感觉离答案更近了,谢谢!
    • 好吧,我没有看到用户是如何与他们的角色相关联的,... db_owner ... 啊,你是说数据库角色吗,我在考虑应用程序角色,嗯,我会看看进入那个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2021-02-15
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多