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
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