如何基于数据库角色构建资源调控器分类器功能?

时间:2010-10-01 20:45:48

标签: sql sql-server

我正在尝试为SQL 2008资源调控器编写分类器函数。我想使用用户创建的数据库角色来确定用户是否应该进入特定的工作负载组。有问题的登录是SQL登录。我不能使用IS_MEMBER(),因为IS_MEMBER将自己限制为当前数据库上下文(在本例中为master)。我无法使用[user database] .sys.database_principals,因为分类器函数必须是模式绑定的(因此限制查找到当前数据库上下文)。此外,函数引用的任何视图也必须是模式绑定的,这意味着我无法在master中创建视图来引用用户数据库的安全视图。

这里的目标是能够基本上从master执行IS_MEMBER()以检查另一个数据库中的角色。

2 个答案:

答案 0 :(得分:4)

您可以在数据库中创建一个DDL触发器,用于更新master中的表,以便您同时拥有所有用户/组信息。然后,您可以查询它。您可能希望至少将触发器附加到ADD_ROLE_MEMBER和DROP_ROLE_MEMBER。

我刚刚开始使用资源调控器,所以如果我遇到“更干净”的方式,我会再次发布。

答案 1 :(得分:0)

MSDN说:

The following system functions can be used for classification: HOST_NAME(), 
APP_NAME(), SUSER_NAME(), SUSER_SNAME(), IS_SRVROLEMEMBER(), and IS_MEMBER().

这表明调控器函数在最终用户的默认数据库中执行,你可以在那里使用IS_MEMBER。

如果没有,我猜您可以将一些系统视图连接在一起,以检查当前用户是否在角色中。系统视图允许您指定三部分名称,例如TestDb.sys.database_principals

select  *
from    master.sys.login_token l
join    TestDB.sys.database_principals m
on      l.sid = m.sid
join    TestDB.sys.database_role_members rm
on      rm.member_principal_id = m.principal_id
join    TestDB.sys.database_principals r
on      rm.role_principal_id = r.principal_id
where   r.name = 'testrole' -- Role Name
        and l.name = SUSER_NAME() -- User Name

这听起来相当复杂和不安全,所以我希望有更好的答案:)