基于角色的SQL插入

时间:2013-05-01 14:36:30

标签: sql security insert key default

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

表1(部门) - 这是一个包含department和departmentID

列的表

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

的表

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

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

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

理想情况下,这可以在用户不知情的情况下完成。我会假设我需要使用“替代”触发器,但我不知道如何继续......

2 个答案:

答案 0 :(得分:0)

不应该太困难:

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

答案 1 :(得分:0)

如果rolename-column(或id)在securityMap-table中是唯一的,则应该可以工作,否则select可以返回多个值,也许你需要以不同的方式选择departmentId。

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表连接,以过滤掉db_owner

等角色