本系列打算用于记录本人在工作中使用到Azure的功能,主要记录与本地SQL Server或者其他比较不一样的地方,不过由于每个人对工具软件的熟悉程度和侧重点不一样,所以无法覆盖所有读者的需求。
前言
第一篇文章记录的是关于Azure SQL DB的用户,在非PaaS版本中,我们通常都使用SSMS来创建和管理登录名和用户。不过对于PaaS,就有点不同。
因为PaaS在界面和权限上跟非PaaS的有比较大的差异,所以假设你不用用到sa这种级别的账号,那么在Azure SQL DB中应该怎么进行登陆和用户的管理呢?
在非PaaS环境中,你会有一个登录名(login)用来登录SQL Server,可以是SQL 身份验证或者是Windows身份验证甚至AD域账号认证(实际上就是一种Windows身份验证),登录名只是让你访问SQL Server,但是不能直接使用里面的数据库,为了达到这个目的,就出现了“用户(users)”,用户就是把登录名通过指定特定的安全组,并映射到独立数据库中,使其可以真正使用数据库,并且不用使用登录名登陆SQL Server然后又要使用用户名访问特定数据库。
形象点来说,登录名就是允许你进入一个酒店里面,可以在大堂或者走廊走动,但是你不能进入客房,直到你获得允许,这个时候你就变成了一个用户,可以进入特定的客房。
PaaS和非PaaS的差异
平台差异
两种不同的平台,在服务器和数据库层面的安全性有相似的地方,也有一些不同的地方,比如:
- 包含的用户:contained user,在Azure SQL DB中它并不映射到一个登录名,而是由Azure Active Directory或者数据库本身来授权。在非PaaS中,一个登录名会映射到数据库中已存在的用户。这种做法的好处是使得数据库更易于移植,毕竟云平台上很多的移植或者迁移都是必须的。
- 某些DB 角色的差异:db_datareade, db_datawriter等是相同的,但是比如sysadmin和serveradmin等是不存在于Azure SQL DB,可以看看下面这个图,不过由两个新的服务器级别角色可以替代,dbmanager,类似于dbcreator可以创建和删除数据库,loginmanager类似于securityadmin可以创建新登录名,注意这里是server的securityadmin而不是下图的db_securityadmin。
- SSMS的操作受限程度很高,绝大部分的鼠标操作最终还是弹出SQL命令,比如右键“Logins”然后选择“New Login”,出现的就如下图:
演示
下面按照几种常见的需求演示一下:
创建常规的SQL 身份验证
使用你在portal上面创建SQL DB时定义的账号及密码连到SQL DB(此时为master库,如果时其他库,是创建不了登录名的),创建一个SQL 身份认证的登录名叫test的,密码为1234.abc。然后在用户数据库中创建一个用户映射到test登录名中,最后添加到db_datareader和db_datawriter角色中。
-- 在Master库中创建SQL 身份验证的登录名
CREATE LOGIN test
WITH PASSWORD = '1234.abc!'
新开一个窗口,然后执行:
-- 选择目标数据库,然后映射到刚才的login中
CREATE USER [test]
FOR LOGIN [test]
WITH DEFAULT_SCHEMA = dbo;
-- 授权
ALTER ROLE db_datareader ADD MEMBER [test];
ALTER ROLE db_datawriter ADD MEMBER [test];
在Azure SQL中,如果你要对所有的库都创建的话,由于不能直接使用USE DB这个命令切换当前数据库,所以你需要打开新的查询窗口。
创建包含用户的SQL 身份验证用户
操作几乎一样,不过注意CREATE USER后面的关键字,包含用户是不需要FOR LOGIN的,直接创建在对应的数据库中即可。
Azure AD用户的创建
重点在于FROM 后面:
-- 添加包含得Azure AD 用户,不需要使用密码
CREATE USER [name@domain.com]
FROM EXTERNAL PROVIDER
WITH DEFAULT_SCHEMA = dbo;
-- 授权
ALTER ROLE dbmanager ADD MEMBER [name@domain.com];
ALTER ROLE loginmanager ADD MEMBER [name@domain.com];
创建具有服务器管理权限的用户
如果需要分配一个账号给其他人进行服务器管理,可以在master库中创建一个用户来实现:
-- 创建登录名
CREATE LOGIN [test2]
WITH PASSWORD='1234.abc!';
-- 创建常规的SQL 身份验证用户到Master库
CREATE USER [test2]
FROM LOGIN [test2]
WITH DEFAULT_SCHEMA=dbo;
-- 添加前面提到的dbmanager和loginmanager角色
ALTER ROLE dbmanager ADD MEMBER [test2];
ALTER ROLE loginmanager ADD MEMBER [test2];
然后可以使用test2这个用户来创建数据库和登录账号的常见删除。如果使用这个用户创建数据库,那么这个用户就是数据库的owner。
说明
Dbmanager是master库中的角色,所以只能把数据库用户添加到这个角色,不能把一个服务器级别的登录名添加给一个数据库级别的角色。