SQL Server - 授予用户在自己的架构中创建表的权限,但不能在 dbo 架构中创建表

问题描述 投票:0回答:2

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

这是我的想法:

  • 为每个学生创建一个模式并授予他们写入权限 到它。
  • 授予他们从 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'.

看起来创建表权限是在数据库级别,而不是模式级别。有没有办法在schema级别授权建表权限?

我希望这一切都有道理。再说一次,我不是 DBA,因此我们将不胜感激。

谢谢!

sql-server database database-design azure-sql-database database-administration
2个回答
4
投票

授予

CREATE TABLE
,其他权限没有任何作用是因为
USER
也没有
ALTER
权限。因此,您需要的只是
GRANT
USER
CREATE TABLE
等对其特定架构的权限,然后
CREATE VIEW
SELECT
架构。
这以 

dbo

为例,因为我没有

WITHOUT LOGIN
对象,但这演示了授予的和隐式拒绝的权限:
LOGIN



0
投票

-- -- 数据库:

CREATE DATABASE SampleDB; GO USE SampleDB; GO CREATE TABLE dbo.SomeTable (SomeID int IDENTITY); INSERT INTO dbo.SomeTable DEFAULT VALUES; GO CREATE USER student1 WITHOUT LOGIN; GO CREATE SCHEMA st1 AUTHORIZATION student1; GO GRANT SELECT ON SCHEMA::dbo TO student1; GRANT CREATE TABLE, CREATE VIEW, CREATE FUNCTION, CREATE PROCEDURE TO student1; GO CREATE USER student2 WITHOUT LOGIN; GO CREATE SCHEMA st2 AUTHORIZATION student2; GO GRANT SELECT ON SCHEMA::dbo TO student2; GRANT CREATE TABLE, CREATE VIEW, CREATE FUNCTION, CREATE PROCEDURE TO student2; GO EXECUTE AS USER = 'student1'; GO CREATE TABLE st1.TestTable (ID int); INSERT INTO st1.TestTable SELECT SomeID FROM dbo.SomeTable; GO SELECT * FROM st1.TestTable; GO REVERT; GO EXECUTE AS USER = 'student2'; GO CREATE PROC st2.TestProc AS BEGIN SELECT * FROM st1.TestTable; END; GO EXEC st2.TestProc; --fails GO CREATE TABLE st1.TestTable (ID int); --fails too GO REVERT; GO USE master; GO DROP DATABASE SampleDB;


-- -- 表的表结构
portfolio

创建表

category

category
int NOT NULL,
id
varchar(255) NOT NULL ) 引擎=InnoDB 默认字符集=utf8mb4 整理=utf8mb4_0900_ai_ci; MySQL 目录:文档
#1273 - 未知排序规则:'utf8mb4_0900_ai_ci'

© www.soinside.com 2019 - 2024. All rights reserved.