【问题标题】:Second member of Azure AD group can not create schema in Azure SQL databaseAzure AD 组的第二个成员无法在 Azure SQL 数据库中创建架构
【发布时间】: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.comuser2@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显式定义为表的架构前缀来规避:

为了调试,我以 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


【解决方案1】:

假设您拥有 AAD 管理员权限,

user1myAADGroup 组的成员时,登录并尝试创建新的SCHEMA。将在数据库中创建一个新模式。如果该组中的任何其他成员,例如 user2 尝试创建 SCHEMA,将显示无效对象名称错误。此外,对于非 SQL 用户、Windows 用户或应用程序角色类型的主体,default_schema_nameNull

通过为组分配默认架构解决了此安全问题。

USE your_database;
GO

CREATE USER [myAADGroup] FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA = dbo;

ALTER USER [myAADGroup] WITH DEFAULT_SCHEMA=[dbo]

但是,请参阅Remarks section of the CREATE SCHEMA documentation 中的以下注释:

注意:不能在 SQL 数据库上隐式创建 Azure Active Directory 用户。由于从外部提供商创建 Azure AD 用户必须检查 AAD 中的用户状态,因此创建用户将失败并出现错误 2760:指定的架构名称“”要么不存在,要么您没有使用它的权限。 然后出现错误 2759:CREATE SCHEMA 由于以前的错误而失败。 要解决这些错误,请先从外部提供商创建 Azure AD 用户,然后重新运行语句创建对象。

【讨论】:

  • 嗨@KarthikBhyresh-MT,感谢您的意见。确实,当我使用我的管理员帐户添加用户 user2@domain.com(来自外部提供商)时,这是可行的。如果不手动将它们添加到数据库中,就无法让我的用户(成员身份经常更改)创建模式?
  • 您可以将它们添加到固定数据库角色 - db_accessadmin 以允许创建任何架构,但根据您的需要,您希望他们访问我认为的特定架构
  • 确实,我希望用户能够创建/访问所有模式,除了其中的几个。我有一张支持支持的票,当我得到明确的答案时会更新这个帖子。
  • 正如@martijn-pieters 的编辑所示,这确实是不可能的,除了手动添加用户之外没有其他解决方法。
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
相关资源
最近更新 更多