对于我正在使用Azure SQL的项目,为了在Web应用程序中使用,我创建了一个用户'justread',在数据库中的一个模式上获得了select - access。
我用经典的方式做了这个,分2步:
在主数据库
上if exists(select * from sys.database_principals where name = N'justread')
begin
drop user [justread]
drop login [justread]
end
go
if not exists (select * from sys.database_principals where name = N'justread')
begin
create login [justread] with password= N'123456'
end
go
在应用程序数据库
上create user [justread] for login [justread] with default_schema=[dbo]
go
grant select on schema::dbo to [justread]
go
在应用程序数据库上,这很好用,但是,我收到了允许同一用户只读访问master数据库的请求。
不要问我为什么......
我首先通过分配访问权限来尝试它,就像我在应用程序数据库中所做的那样:
create user [justread] for login [justread] with default_schema=[dbo]
go
grant select on schema::dbo to [justread]
go
第一个查询有效,没问题。但第二次失败,出现以下错误:
Msg 15151, Level 16, State 1, Line 5
Cannot find the schema 'dbo', because it does not exist or you do not have permission.
我尝试使用Google搜索,发现它是如何使用经典SQL Server完成的,但我也收到了错误消息:
grant view server state to [justread]
go
Msg 40520, Level 16, State 1, Line 4
Securable class 'server' not supported in this version of SQL Server.
我该如何完成这项工作?
答案 0 :(得分:0)
首先,您是否要在master数据库中创建表并在这些表上授予'justread'用户权限?如果是这种情况,我们将无法在Azure SQL中的master数据库中创建表。 Azure SQL中的主数据库是只读的,它可以保存有关角色,登录等信息。
但是,如果要在Azure SQL中为master数据库的系统表授予“justread”用户权限,只需在master数据库中执行以下脚本即可。我测试过程,justread用户可以在执行下面的脚本后访问master数据库的系统表。
create user [justread] for login [justread] with default_schema=[dbo]
Go
其次,根据此official article,VIEW SERVER STATE当前不是Azure SQL支持的概念,因此在运行以下脚本时会收到错误消息。
grant view server state to [justread]
go
答案 1 :(得分:0)
创建用户[justread]是为了在我的应用程序的数据库上执行简单的数据查询。由于我不知道的原因,客户端还需要此用户具有对#34; Master"的读取权限。数据库中。
使用以下查询,我设法为[justread]提供所需的访问权限,因此我可以在master数据库上执行查询。
create user [justread] for login [justread] with default_schema=[dbo]
Go

有些表似乎仍然无法访问,但以下错误消息似乎表明:
目前,这可能就足够了。
答案 2 :(得分:0)
以下是我如何向外部用户(在Azure AD中)授予对我的数据库的只读权限:
CREATE USER [externaluser] FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA=[dbo]
GO
ALTER ROLE db_datareader ADD MEMBER [externaluser]
GO
相关文章: