LocalDb 上 'PROVIDER' 附近的语法不正确

Incorrect syntax near 'PROVIDER' on LocalDb

IF NOT EXISTS (SELECT [name], [type] 
    FROM [sys].[database_principals] 
    WHERE [type] = N'E' AND [name] = N'userId')
BEGIN
    CREATE USER [userId] FROM EXTERNAL PROVIDER
    ALTER ROLE db_datareader ADD MEMBER [userId]
    ALTER ROLE db_datawriter ADD MEMBER [userId]
END

运行 这对 Azure SQL 数据库有效。

LocalDb 失败 Incorrect syntax near 'PROVIDER'

我明白为什么。LocalDb 有解决方法吗?

来自文档CREATE USER (Transact-SQL):

EXTERNAL PROVIDER 仅适用于:SQL 数据库,SQL 数据仓库。

新语法扩展 FROM EXTERNAL PROVIDER 可用于在 SQL 数据库托管实例中创建服务器级 Azure AD 登录。

这意味着 local/on-premise SQL 服务器不支持此语法。

我搜索了 local/on-premise SQL 服务器,但没有找到任何关于 AAD 的解决方法。

我们仍然可以使用下面的语法使它看起来像 Azure_Active_Directory_principal :

USE master
CREATE login [leon@****.com] with password='****'

USE Mydatabase
IF NOT EXISTS (SELECT [name], [type] 
    FROM [sys].[database_principals] 
    WHERE [type] = N'E' AND [name] = N'userId')
BEGIN
    CREATE USER [leon@****.com] FOR LOGIN [leon@****.com]
    ALTER ROLE db_datareader ADD MEMBER [leon@****.com]
    ALTER ROLE db_datawriter ADD MEMBER [leon@****.com]
END

希望对您有所帮助。

如果您使用 sqlcmd(或 .dacpac),您可以使用此条件语法:

if SERVERPROPERTY('EngineEdition') > 4
begin
   :r ContainedUser.sql
end

出于性能原因,我建议您不要创建登录名,而只创建一个包含的用户:

IF NOT EXISTS (SELECT [name]
                FROM [sys].[database_principals]
                WHERE [name] = N'DbUser')
BEGIN
    CREATE USER [DbUser]
    WITH PASSWORD = '$(DbUserPassword)';

    GRANT CONNECT TO [DbUser];

    ALTER ROLE db_owner ADD MEMBER [DbUser];
END