sql server登录名只能看到自己拥有权限的库
正文
#背景
SQL Server实例上有多个服务商的数据库,每个数据库要由各自的服务商进行维护,
为了限定不同服务商商的维护人员只能访问自己的数据库,且不能看到其他服务商的数据库,现需要给各个服务商商限定权限,让他们登录SQL Server只能看到授权的数据库而无法看到其他数据库。
【1】SSMS操作
1、先给不同的服务商创建不同的登录名(如下以一个服务商为例)
2.将登录名加入到public服务器角色中
反正默认也会加入public的
3.将public服务器角色的属性——>安全对象中取消查看所有数据库的权限
sql server 2005 及相关低版本:
把勾去掉;
sql server高版本:
把勾去掉,上图已经把勾去掉了;
或者执行如下SQL:
REVOKE VIEW ANY DATABASE TO [public]
4.将待授权的数据库的dbowner指派给该用户
执行下面任意一种方法sql 即可
--方法(1) use master; ALTER AUTHORIZATION ON DATABASE::Test2 TO test22 --方法(2) use test2 EXEC dbo.sp_changedbowner N'test22'
或使用SSMS操作:
运行上面代码命令,或上面SSMS修改操作 之后的效果图
【最终效果】
【如何取消?】
注意:此处的设置不能手动取消,会有错误提示:
解决办法,执行sql修改该数据库的所有者,执行下面代码任意一种方法即可
--方法(1) use master; ALTER AUTHORIZATION ON DATABASE::Test2 TO sa --方法(2) use test2 EXEC dbo.sp_changedbowner N'sa'
--方法(3)
【2】T-SQL实现
USE [master] GO -- create login name CREATE LOGIN [test22] WITH PASSWORD=N'123456',check_policy=off GO -- removke public see databases revoke view any database to public; go -- change login:test22 mapping database user:dbo ALTER AUTHORIZATION ON DATABASE::Test TO test22 go
【3】为什么我一直不能成功?
(1)必须要先 revoke view any database to public 之后,才给登录名创建对应数据库的user权限;
如:
--方法(1) use master; ALTER AUTHORIZATION ON DATABASE::Test2 TO test22 --方法(2) use test2 EXEC dbo.sp_changedbowner N'test22'
否则,就算授权后,取消了,再进行上面的代码操作,依然不会生效;
【4】缺陷
这种方式,很明显的缺陷就是,不能做更详细、具体的权限控制,直接就给了db_owner 角色,这个角色那可是对该库 可以为所欲为的啊!
这种办法,用完之后
其他多库的非管理员账户看不到任何库,但可以操作有权限的库,但连接上去不会显示库名。可以用 select * from maste.sys.databases 来获取库名操作,有得有失,这个做的不太好。
不知道高版本是否有改正,这方面mysql倒是好很多
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2018-01-11 Oracle与Sql server 在SQL上的不同