我不是 DBA,但被要求帮助为一些公司内部 SQL 课程建立教学数据库。我使用的是 Azure SQL Server 数据库,每个学生都需要能够为自己创建表、视图和存储过程,但看不到任何其他学生的作业。由于成本限制,我无法为每个学生创建一个 Azure 数据库并使用原始数据加载它,因此我尝试在一个数据库中完成这一切。
这是我的想法:
我已经能够创建登录名、用户和架构,并授予 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,因此我们将不胜感激。
谢谢!
授予
CREATE TABLE
,其他权限没有任何作用是因为USER
也没有ALTER
权限。因此,您需要的只是 GRANT
USER
、CREATE TABLE
等对其特定架构的权限,然后 CREATE VIEW
于 SELECT
架构。这以 dbo
为例,因为我没有
WITHOUT LOGIN
对象,但这演示了授予的和隐式拒绝的权限:LOGIN
-- -- 数据库:
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'