【问题标题】:SQL Server - Give user permission to create table in their own schema, but not in dbo schemaSQL Server - 授予用户在自己的架构中创建表的权限,但不在 dbo 架构中
【发布时间】: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


    【解决方案1】:

    授予CREATE TABLE 和其他权限不起作用是因为USER 也没有ALTER 权限。因此,您只需要GRANTUSERCREATE TABLECREATE VIEW 等对其特定架构的权限,然后是SELECTdbo 架构的权限。

    这以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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多