我正在尝试根据 AD 组向 (sql 2005) 数据库应用程序授予权限。一般的想法是要求用户拥有“app_users”成员资格才能查看任何内容,而其他组成员资格则赋予他们对该组的写访问权限。“app_customers”授予对客户模块的写访问权限,“app_sales”授予对销售模块的写访问权限,等等。
我在下面列出了一个例子:
用户 1:app_users 的 AD 成员
用户 2:app_users、app_customers 的 AD 成员
对于 dbo.customers 表:
app_users
- 授予:选择权限
- 拒绝:插入、更新、删除
app_customers
- 授予:选择权限
- 授予:插入、更新、删除
我希望用户 1 能够查看 dbo.customers 表,但不允许修改任何内容(插入/更新/删除)- 这可行。同样,我希望用户 2 能够查看和修改 dbo.customers 表,因为他们是 app_customers 的成员。
然而,事实并非如此。相反,用户 2 和用户 1 一样被拒绝任何修改。我似乎记得如果存在冲突,拒绝权限会获胜,但老实说,我已经很久没有处理过它们了。
我这样做对吗?
答案1
拒绝将始终覆盖授权。您需要撤销对 app_users 的拒绝权限。如果用户没有权限,则无需拒绝权限,除非您永远不希望他们拥有该表的权限。
select sys.schemas.name 'Schema', sys.objects.name Object, sys.database_principals.name username, sys.database_permissions.type permissions_type,
sys.database_permissions.permission_name,
sys.database_permissions.state permission_state,
sys.database_permissions.state_desc,
state_desc + ' ' + permission_name + ' on ['+ sys.schemas.name + '].[' + sys.objects.name + '] to [' + sys.database_principals.name + ']' COLLATE LATIN1_General_CI_AS
from sys.database_permissions
join sys.objects on sys.database_permissions.major_id =
sys.objects.object_id
join sys.schemas on sys.objects.schema_id = sys.schemas.schema_id
join sys.database_principals on sys.database_permissions.grantee_principal_id =
sys.database_principals.principal_id
order by 1, 2, 3, 5