【发布时间】:2020-10-29 21:27:49
【问题描述】:
我不是 DBA,但有人要求我帮助建立一些公司内部 SQL 课程的教学数据库。我正在使用 Azure SQL Server 数据库,每个学生都需要能够为自己创建表、视图和存储过程,但看不到其他学生的任何工作。由于成本限制,我无法为每个学生创建一个 Azure DB 并使用原始数据加载它,因此我试图在一个 DB 中完成所有操作。
这是我的想法:
- 为每个学生创建一个模式并授予他们写入权限 给它。
- 授予他们从 dbo 架构中读取数据的权限 原始数据将被存储,但不会写入(我不想让他们有机会覆盖原始表)。
- 隐藏所有其他学生架构,以便学生只能看到他们的 表/视图/sprocs 和 dbo 架构中的那些。
我已经能够创建登录名、用户和架构并授予对 dbo 架构的读取权限,但我无法让学生完全控制他们自己的架构。
我需要建议的是,如何设置数据库以让每个学生都有自己的具有写访问权限的架构,但对 dbo 架构具有只读访问权限?似乎我可以锁定学生模式,但如果没有对整个数据库的写访问权限,就不能给他们写访问权限。有没有办法以这种方式将它们分开?
另外,关于在同一个数据库上分离学生的环境,有没有更好的方法来做我想做的事情?
这是我迄今为止尝试过的:
USE MASTER
CREATE LOGIN student1 WITH PASSWORD = 'T3mpSuperSecret!';
USE class_DB
CREATE USER student1 FOR LOGIN student1;
CREATE SCHEMA st1 AUTHORIZATION student1;
GRANT SELECT ON SCHEMA :: dbo TO student1
GRANT CONTROL ON SCHEMA :: st1 TO student1
然后我尝试从 dbo 中选择一个基表到新架构中:
select *
into st1.inventories
from dbo.inventories
我明白了:
Msg 262, Level 14, State 1, Line 1
CREATE TABLE permission denied in database 'class_DB'.
看起来创建表权限是在数据库级别,而不是架构级别。有没有办法在架构级别授权创建表权限?
我希望这一切都有意义。再次重申,我不是 DBA,因此我们将不胜感激。
谢谢!
【问题讨论】:
标签: sql-server database database-design azure-sql-database database-administration