通过数据库角色与用户限制视图访问权限
在 SQL Server 中,可以通过创建自定义数据库角色、授予视图查询权限、再绑定用户的方式,实现只允许特定账号访问指定视图的效果。
操作步骤
1. 选择要操作的数据库
在 SQL Server Management Studio 中切换到目标数据库(或使用 USE 数据库名)。
2. 创建数据库角色
-- 创建一个数据库角色,名称为 seeview
EXEC sp_addrole 'seeview'Code language: JavaScript (javascript)
3. 为角色分配视图查询权限
-- 授予角色对指定视图的 SELECT 权限
-- 该角色只能查看下面赋予的这些视图,除此之外的表或视图均不可见
GRANT SELECT ON v_viewname1 TO seeview
GRANT SELECT ON v_viewname2 TO seeview
4. 创建登录名(服务器级别)
-- exec sp_addlogin '登录名','密码','默认数据库名'
EXEC sp_addlogin 'guest', 'guest', 'ICCard_TangHe'Code language: JavaScript (javascript)
注意:如果密码强度不够,
sp_addlogin可能执行失败。此时可以在 SSMS 界面中手动创建登录名,并勾选”强制实施密码策略”以外的选项,或设置符合强度要求的密码。
5. 创建数据库用户并绑定到角色
-- exec sp_adduser '登录名','用户名','角色'
EXEC sp_adduser 'guest', 'guest', 'seeview'Code language: JavaScript (javascript)
完整示例
-- 1. 创建数据库角色
EXEC sp_addrole 'xfxfzfztviewer'
-- 2. 分配视图查询权限给角色
GRANT SELECT ON View_XFXF_JFZT TO xfxfzfztviewer
-- 3. 创建登录名(服务器级别)
EXEC sp_addlogin 'xfxfzfztguest', 'xfxfzfztguestpwd2019', 'ChargeV4.0_GuangCai_20190510'
-- 4. 创建数据库用户并绑定到角色
EXEC sp_adduser 'xfxfzfztguest', 'xfxfzfztguest', 'xfxfzfztviewer'Code language: JavaScript (javascript)
权限验证
使用新创建的登录名 xfxfzfztguest 连接数据库后:
| 操作 | 结果 |
|---|---|
SELECT * FROM View_XFXF_JFZT | ✅ 成功 |
SELECT * FROM 其他表 | ❌ 拒绝访问 |
SELECT * FROM 未授权的视图 | ❌ 拒绝访问 |
补充说明
sp_addrole:在当前数据库中创建新的数据库角色。sp_addlogin:在 SQL Server 实例级别创建登录账号。sp_adduser:在当前数据库中创建数据库用户,并将其关联到指定角色。GRANT SELECT ON 视图名 TO 角色名:只授予对指定视图的查询权限,不授予对底层表的权限(视图需自行定义好过滤逻辑)。- 如果需要对多个视图授权,逐条执行
GRANT SELECT ON 视图名 TO 角色名即可。