【发布时间】:2021-09-15 12:41:41
【问题描述】:
我们对带有 AAD 身份验证的 Azure SQL 数据库有一个奇怪的问题。
我们创建了一个具有所有权限的角色 (dbt_user),并排除了一些架构:
CREATE ROLE dbt_user AUTHORIZATION dbo;
GRANT CREATE SCHEMA, ALTER, DELETE, EXECUTE, INSERT, REFERENCES, SELECT, UPDATE TO dbt_user;
DENY ALTER, DELETE, EXECUTE, INSERT, UPDATE ON SCHEMA :: dbo TO dbt_user;
DENY ALTER, DELETE, EXECUTE, INSERT, UPDATE ON SCHEMA :: schema1 TO dbt_user;
DENY ALTER, DELETE, EXECUTE, INSERT, UPDATE ON SCHEMA :: schema2 TO dbt_user;
然后,我们添加一个 AAD 组 (myAADGroup) 作为用户,并将其添加到上面的角色中:
CREATE USER [myAADGroup] FROM EXTERNAL PROVIDER;
ALTER ROLE dbt_user ADD MEMBER [myAADGroup];
AAD 组有 2 个成员:user1@domain.com 和 user2@domain.com。
第一个用户可以登录,执行如下命令:
CREATE SCHEMA [test_schema_user1];
但是,当 user2 执行以下命令时,我们得到一个错误:
CREATE SCHEMA [test_schema_user2];
Msg 2760, Level 16, State 1, Line 1
The specified schema name "user2@domain.com" either does not exist or you do not have permission to use it.
Msg 2759, Level 16, State 0, Line 1
CREATE SCHEMA failed due to previous errors.
只有第一个用户可以成功创建架构。
我在网上只找到了2个稍微相关的问题,但是他们谈论的是CREATE TABLE,可以通过将dbo显式定义为表的架构前缀来规避:
- Microsoft Tech Community
- Azure docs(见第 5 步末尾的注释)
为了调试,我以 user2@domain.com 的身份执行了一些操作:
select SCHEMA_NAME()
-- returns dbo
SELECT name, default_schema_name
FROM sys.database_principals
WHERE name = 'myAADGroup'
-- default_schema_name = dbo
SELECT name, default_schema_name
FROM sys.database_principals
WHERE name = 'dbt_user'
-- default_schema_name = null --> a role can not have a default_schema?
谢谢!
【问题讨论】:
-
this 可能是一个相关问题
标签: sql sql-server tsql azure-active-directory azure-sql-database