Sql server SQL Server-授予用户在其自己的模式中创建表的权限,但不允许在dbo模式中创建表

Sql server SQL Server-授予用户在其自己的模式中创建表的权限,但不允许在dbo模式中创建表,sql-server,database,database-design,azure-sql-database,database-administration,Sql Server,Database,Database Design,Azure Sql Database,Database Administration,我不是DBA,但被要求帮助为一些公司内部的SQL类建立教学数据库。我使用的是Azure SQL Server数据库,每个学生都需要能够为自己创建表、视图和存储过程,但看不到其他学生的任何工作。由于成本限制,我无法为每个学生创建一个Azure DB并加载原始数据,所以我尝试在一个DB中完成所有工作 我的想法是: 为每个学生创建一个模式,并授予他们写的权限 去吧 给他们从dbo模式读取的权限,其中 原始数据将被存储,但不会写入(我不想让他们有机会覆盖原始表) 隐藏所有其他学生模式,以便学生只能看到

我不是DBA,但被要求帮助为一些公司内部的SQL类建立教学数据库。我使用的是Azure SQL Server数据库,每个学生都需要能够为自己创建表、视图和存储过程,但看不到其他学生的任何工作。由于成本限制,我无法为每个学生创建一个Azure DB并加载原始数据,所以我尝试在一个DB中完成所有工作

我的想法是:

  • 为每个学生创建一个模式,并授予他们写的权限 去吧
  • 给他们从dbo模式读取的权限,其中 原始数据将被存储,但不会写入(我不想让他们有机会覆盖原始表)
  • 隐藏所有其他学生模式,以便学生只能看到他们的 表/视图/存储过程以及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,因此任何帮助都将不胜感激


谢谢

授予
创建表
,而其他权限不起任何作用的是
用户
也没有
更改
权限。因此,您只需
授予
用户
对其特定架构的
创建表
创建视图
等权限,然后
dbo
架构上选择

这将使用with
with with LOGIN
作为示例,因为我没有
LOGIN
对象,但这演示了授予和隐式拒绝的权限:

创建数据库SampleDB;
去
使用SampleDB;
去
创建表dbo.SomeTable(SomeID int-IDENTITY);
插入到dbo.SomeTable中
默认值;
去
创建用户student1,无需登录;
去
创建模式st1授权student1;
去
将SCHEMA::dbo上的SELECT授予student1;
将创建表、创建视图、创建函数、创建过程授予student1;
去
创建用户student2,无需登录;
去
创建模式st2授权student2;
去
将SCHEMA::dbo上的SELECT授予student2;
将创建表、创建视图、创建函数、创建过程授予student2;
去
以用户身份执行='student1';
去
创建表st1.TestTable(ID int);
插入到st1.TestTable中
选择SomeID
来自dbo.SomeTable;
去
挑选*
来自st1.TestTable;
去
还原
去
以用户身份执行='student2';
去
创建PROC st2.TestProc作为
开始
挑选*
来自st1.TestTable;
终止
去
EXEC st2.TestProc--失败
去
创建表st1.TestTable(ID int)--也失败了
去
还原
去
使用master;
去
删除数据库SampleDB;