架构所有者无法创建 table

schema owner is not able to create table

我是 SQL DW 的新手,但对 DB 有一些经验

我正在尝试创建具有不同权限的用户 (3),但希望将他们限制在一个架构中 "dep"。所以我做了以下。

1) 使用超级管理员 ID 登录数据库。然后 运行 以下命令。他们都工作得很好

enter code here---main db
CREATE LOGIN dep_ingestion_owner_login WITH PASSWORD = 'XXXXXXXXXXXXXXX';
CREATE LOGIN dep_ingestion_rw_login WITH PASSWORD = 'XXXXXXXXXXXXXXX';
CREATE LOGIN dep_ingestion_ro_login WITH PASSWORD = 'XXXXXXXXXXXXXXX';
go

---inside db "db-testing"
CREATE SCHEMA dep;
create user dep_ingestion_owner_user for login dep_ingestion_owner_login;
create user dep_ingestion_rw_user for login dep_ingestion_rw_login;
create user dep_ingestion_ro_user for login dep_ingestion_ro_login;
ALTER AUTHORIZATION ON SCHEMA::dep to dep_ingestion_owner_user;
go

GRANT SELECT,INSERT,UPDATE,DELETE ON SCHEMA :: dep TO dep_ingestion_rw_user WITH GRANT OPTION;
GRANT SELECT ON SCHEMA :: dep TO dep_ingestion_ro_user WITH GRANT OPTION;
go

我可以通过 SSMS 查看架构名称和用户。

现在我正在尝试使用用户 ID“dep_ingestion_owner_login” 登录并选择数据库作为 => db-testing

登录工作正常。但是下面的命令给我错误。

CREATE TABLE depletions_ke.Sizes (ChainID int, width dec(10,2));

我也尝试了不同的排列,但得到了同样的错误。

CREATE TABLE [db-testing].depletions_ke.Sizes (ChainID int, width dec(10,2));

消息 6004,级别 14,状态 9,第 1 行 用户无权执行此操作。 将数据库上下文更改为 'db-testing'.

根据您的代码,您已经在数据库 "db-testing".

中创建了三个登录名和三个用户的映射

您创建了一个架构“dep”。当创建新用户时未指定架构,它将具有默认架构“dbo”。

所以这三个用户都有相同的模式dbo

"ALTER AUTHORIZATION ON SCHEMA::dep to dep_ingestion_owner_user" 表示将架构 dep 的所有权转让给用户 dep_ingestion_owner_user

模式是数据库对象的集合,包括表、视图、触发器、存储过程、索引等。模式与称为模式所有者的用户名相关联,谁是逻辑上相关的数据库对象的所有者。

架构所有者并不意味着它是数据库所有者

您没有授予用户 dep_ingestion_owner_user 任何数据库角色,例如 "db_owner"。这就是为什么你只能登录数据库而没有SELECT,INSERT,UPDATE,DELETE权限的原因。

您应该添加此代码以授予用户 "db_owner":

EXEC sp_addrolemember 'db_owner', 'dep_ingestion_owner_user';

你的完整代码应该是这样的:

enter code here---main db
CREATE LOGIN dep_ingestion_owner_login WITH PASSWORD = 'XXXXXXXXXXXXXXX';
CREATE LOGIN dep_ingestion_rw_login WITH PASSWORD = 'XXXXXXXXXXXXXXX';
CREATE LOGIN dep_ingestion_ro_login WITH PASSWORD = 'XXXXXXXXXXXXXXX';
go

---inside db "db-testing"
CREATE SCHEMA dep;
create user dep_ingestion_owner_user for login dep_ingestion_owner_login;
create user dep_ingestion_rw_user for login dep_ingestion_rw_login;
create user dep_ingestion_ro_user for login dep_ingestion_ro_login;
ALTER AUTHORIZATION ON SCHEMA::dep to dep_ingestion_owner_user;
EXEC sp_addrolemember 'db_owner', 'dep_ingestion_owner_user';
go

GRANT SELECT,INSERT,UPDATE,DELETE ON SCHEMA :: dep TO dep_ingestion_rw_user WITH GRANT OPTION;
GRANT SELECT ON SCHEMA :: dep TO dep_ingestion_ro_user WITH GRANT OPTION;
go

请参考:

  1. 控制和授予对 SQL 数据库和 SQL 的数据库访问权限 数据仓库.
  2. Database-Level Roles

希望对您有所帮助。