我有一个包含3个表的数据库:
表1(部门) - 这是一个包含department和departmentID
列的表表2(SecurityMap) - 这是一个将角色名映射到部门ID
的表表3(客户信息) - 这是根据用户角色成员身份向用户显示的信息
我有基于角色功能的所有SELECT工作。
我需要的是根据用户角色成员身份,弄清楚如何在默认情况下将特定值插入表3中的DepartmentID列。例如,当有人向数据库添加新行时 - 除了他们在“添加”表单中提供的数据之外,我还需要在此列中插入默认值。如果他们是Marketing角色的成员,那么它应该是1,如果他们是IT角色的成员,那么它应该是2,等等......
理想情况下,这可以在用户不知情的情况下完成。我会假设我需要使用“替代”触发器,但我不知道如何继续......
答案 0 :(得分:0)
不应该太困难:
答案 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
等角色