0

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

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

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

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

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

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

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

4

2 回答 2

0

应该不会太难:

  1. 在您的应用程序中,跟踪登录用户及其角色。
  2. 当您的应用程序保存客户数据时,请确保它向数据库传递角色 ID 以及用户输入的数据(存储过程在这里是理想的)
  3. 当数据库处理提供的数据时,它会将角色 ID 保存到相应的列中。
于 2013-05-01T15:10:39.743 回答
0

如果角色名称列(或 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 这样的角色

于 2013-05-01T15:15:05.473 回答