上周有朋友向我提出这样一个需求:区分用户访问数据库的权限。顺便总结一下需求:某个用户有查询所有数据库的权限某个用户只有备份数据库的权限一个用户只能查看指定数据库的权限一个用户只有某个用户的权限table要执行上述任务,首先我们首先了解与数据库的权限相关的内容。主题“主题”是一个可以请求SQLServer资源的实体。与SQLServer授权模型的其他组件一样,主体也可以按层次结构排列。主题的影响范围取决于主题定义的范围(Windows、服务器或数据库)以及主题是不可分割的还是集合。例如,Windows登录名是一个不可分割的主体,而Windows组是一个集体主体。每个主体都有一个安全标识符(SID)。Windows级主体Windows域登录Windows本地登录SQLServer级主体SQLServer登录服务器角色数据库级主体数据库用户数据库角色应用程序角色SQLServersa登录SQLServersa登录是服务器级主体。默认情况下,此登录名是在安装实例时创建的。公共数据库角色每个数据库用户都属于公共数据库角色。当用户未被授予或拒绝对安全对象的特定权限时,该用户将继承授予该安全对象公共角色的权限。INFORMATION_SCHEMA和sys每个数据库包含两个实体:INFORMATION_SCHEMA和sys,它们都作为用户出现在目录视图中。SQLServer需要这两个实体。它们不是主题,不能修改或删除。带有双井号(##)括起的服务器主体的基于证书的SQLServer登录名仅供内部系统使用。以下主体是在安装SQLServer时根据证书创建的,不应删除。##MS_SQLResourceSigningCertificate######MS_SQLReplicationSigningCertificate####MS_SQLAuthenticatorCertificate####MS_AgentSigningCertificate######MS_PolicyEventProcessingLogin######MS_PolicySigningCertificate####MS_PolicyTsqlExecutionLogin##guest用户每个数据库包含一个来宾。授予来宾用户的权限由有权访问数据库但在数据库中没有用户帐户的用户继承。来宾用户无法删除,但可以通过撤销用户的CONNECT权限来禁用它。可以通过在master或tempdb以外的任何数据库中执行REVOKECONNECTFROMGUEST来撤销CONNECT特权。客户端和数据库服务器根据定义,客户端和数据库服务器是安全主体并且可以受到保护。这些实体可以在建立安全网络连接之前相互验证。SQLServer支持Kerberos身份验证协议,该协议定义了客户端如何与网络身份验证服务交互。创建数据库用户SQL2016支持11种用户类型:master中基于登录名的用户是最常见的用户类型。用户基于WindowsActiveDirectory帐户基于登录CREATEUSER[Contoso\Fritz];基于Windows组登录的用户。创建用户[Contoso\Sales];基于使用SQLServer身份验证登录的用户。创建用户Mary;建议在数据库中对用户进行身份验证,以帮助使您的数据库可移植。在SQL数据库中始终允许。中包含的数据库中只允许使用SQLServer。用户CREATEUSER[Contoso\Fritz]基于没有登录的Windows用户;基于Windows组的用户,无需登录。创建用户[Contoso\Sales];SQLDatabase或SQL数据仓库中基于AzureActiveDirectory的用户。从外部提供商创建用户[Contoso\Fritz];包含带密码的数据库用户。(在SQL数据仓库中不可用。)CREATEUSERMaryWITHPASSWORD='********';基于WindowsPrincipals通过Windows组登录连接的用户基于无登录但可通过Windows组中的成员访问基于没有登录名但可以通过其他Windows组中的成员身份连接到数据库引擎的Windows组的用户。创建用户[Contoso\Fritz];未经身份验证的用户这些用户无法登录到SQLServer或SQL数据库。没有登录的用户。无法登录,但可以授予权限CREATEUSERCustomAppWITHOUTLOGIN;基于证书的用户。无法登录,但可以授予权限并且可以对模块进行签名。为证书CarnationProduction50创建用户测试流程;基于非对称密钥的用户。无法登录,但可以授予权限并且可以对模块进行签名。CREATEUserTestProcessFROMASYMMETRICKEYPacificSales09;下图为创建数据库用户所需选项含义:创建用户可以使用界面完成:也可以使用T-SQL创建--创建登录名:TestPassword:'123456'.CREATELOGINTestWITH密码='123456';GO上面说完了用户,我们再来说说数据库角色和权限服务器级权限SQLServer提供了服务器级角色来帮助你管理服务器上的权限。这些角色是可以与其他主体组合的安全主体。服务器级角色的权限范围是服务器范围的。(“角色”类似于Windows操作系统中的“组”。)SQLServer提供了九种固定的服务器角色。不能更改授予固定服务器角色的权限。从SQLServer2012开始,您可以创建用户定义的服务器角色并向用户定义的服务器角色添加服务器级别的权限。您可以将服务器级主体(SQLServer登录名、Windows帐户和Windows组)添加到服务器级角色。固定服务器角色的每个成员都可以将其他登录添加到同一角色。用户定义的服务器角色的成员不能将其他服务器主体添加到该角色。下表显示了服务器级别的固定角色及其权限下表显示了固定数据库角色及其可以执行的操作。这些角色存在于所有数据库中。无法更改分配给固定数据库角色的权限无法更改分配给固定数据库角色的权限。下图显示了分配给固定数据库角色的权限:SQL2016对某些数据库具有特殊权限msdb角色msdb数据库包含下表所示的特殊用途角色。使用RServicesSQLServer(从SQLServervNext开始)安装RServices时,可以使用其他数据库角色来管理包。下面介绍如何实现文章前面提到的需求:给一个用户查询所有数据库的权限,只给一个用户备份数据库的权限给一个用户只给指定数据库的权限给一个用户只给某个用户的权限table赋予某用户查询所有数据库的权限创建用户USE[master]GOCREATELOGIN[Test1]WITHPASSWORD=N'password@123'UseTest1连接数据库实例,可以看到数据库列表,但是不能访问数据库。授予test1对FinaceDemo的读取权限USE[FinaceDemo]GOCREATEUSER[Test1]FORLOGIN[Test1]ALTERROLE[db_datareader]ADDMEMBER[Test1]GOlikethis您可以授予用户test1对finacedemo的读取权限,但test1不会有写权限,所以可以单独查看test1授予的数据库的读权限。只给一个用户备份数据库Test1的权限没有finacedemo的备份权限授予备份权限ALTERROLE[db_backupoperator]ADDMEMBER[Test1]只给一个用户指定数据库的权限我们需要Test1只能看到FinanceDemo,其他都可以databases看不到执行下面脚本的效果USE[master]DenyVIEWanyDATABASETOTest1;gorunningTest1connect后看不到任何数据库执行:ALTERAUTHORIZATIONONDATABASE::FinanceDemoTOtest1完成后结果:Test1可以查看授权数据库只给用户某表权限创建测试用户test3USE[master]GOCREATELOGIN[Test3]WITHPASSWORD=N'password@123'-----允许test2登录testDBUSE[testdb]GOCREATEUSER[Test3]FORLOGIN[Test3]GOGranttest3thet2表的update和select权限grantupdateondbo.t2totest3grantselectondbo.t2totest3usetestDB检查test3用户获得的权限execsp_helprotect@username='test3'可以看到直到用户test3有select和updatet2的权限,执行select*fromt2执行insert操作失败。以上介绍了数据库权限的详细管理。更详细的控制请参考technet上的资料。权限管理很复杂,以上只是简单介绍。需要更详细的内容,需要自己去研究。可以在technet上找到更详细的信息。
