Неверный синтаксис рядом с 'PROVIDER' на LocalDb - PullRequest
0 голосов
/ 08 апреля 2020
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?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Если вы используете sqlcmd (или .dacpa c), вы можете использовать этот условный синтаксис:

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
0 голосов
/ 09 апреля 2020

Из документа СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ (Transact- SQL) :

EXTERNAL PROVIDER Только для: SQL База данных, SQL Хранилище данных. enter image description here

Новое расширение синтаксиса, ОТ ВНЕШНЕГО ПРОВАЙДЕРА доступно для создания учетных записей уровня сервера Azure AD в SQL Управляемый экземпляр базы данных.

Это означает, что локальный / локальный SQL Сервер не поддерживает этот синтаксис.

Я искал и не нашел обходного пути в отношении AAD для локального / локального SQL сервера. .

Мы все еще могли бы использовать приведенный ниже синтаксис, чтобы выглядеть так: 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

enter image description here

Надеюсь, это поможет.

...