Security 13:SQL Server 默认的角色和用户

SQL Server在服务器级别和数据库级别都有默认的安全主体(Principal),用户经常遇到的有sa 登录,dbo 用户,guest 用户和public角色,public 角色分为服务器级别和数据库级别。

一,sa 登录

sa login 是服务器级别的特殊安全主体,登录名是sa,是服务器级别的SQL LOGIN。默认情况下,在安装SQL Server实例时,sa login就被创建了。从SQL Server 2005开始,sa login的默认数据库是master,并且是sysadmin角色的成员,因此sa login拥有服务器的最高权限,并且权限不能被限制。虽然sa login不能被删除,但是可以禁用。一旦sa被禁用,任何人都无法使用sa login来管理SQL Server实例。

二,数据库级别的特殊用户

在数据库级别,SQL Server在每个数据库中都预先创建了两个特殊的用户:dboguest,在每个数据库中都有这两个用户(User):

  • dbo(database owner的简称):是WINDOWS_USER,数据库的所有者(Owner),每个数据库都有一个dbo用户,SQL Server把固定服务器角色 sysadmin 的成员、sa login和数据库的owner都映射到数据库用户 dbo上。
  • guest:宾客,是SQL_USER,对于任何没有映射到数据库用户的有效登陆(Login),SQL Server使用guest账户登陆数据库。在登陆数据库之前,需要分配权限给guest, 一般给guest查看(select)数据库对象的权限,默认情况下,guest是没有登录数据库的权限。

1,dbo 用户

dbo是数据库所有者(database owner)的简写,dbo用户存在于每一个数据库中,是数据库中权限最大的user,sa login,sysadmin角色的所有成员和数据库的Owner,都会以dbo身份登录到数据库 。

dbo用户拥有数据库的所有权限,权限不能被限制,不能被删除,也不能被禁用。dbo 用户并不完全等价于db_owner 角色,通常情况下,db_owner角色的成员就是数据库的所有者(Database Owner)。

2,guest 用户

每个数据库都包含一个guest用户,当一个login有权限登录SQL Server实例后,如果没有在数据库中映射响应的user账户,那么该login使用guest用户连接到数据库,同时继承guest用户的权限,以guest的身份来访问数据库。

guest用户默认存在每个数据库中,默认情况下,guest用户是禁用的,可以通过命令启用guest用户。

GRANT CONNECT TO GUEST

一旦启用guest用户,所有可以登陆到SQL Server的Login,都可以使用guest身份来访问数据库,并拥有guest用户的权限,可以通过命令禁用guest用户。guest用户不会被删除,但是可以通过回收 CONNECT 权限来禁用。

REVOKE CONNECT FROM GUEST;

注意:只能在 master 和 tempdb 以外的数据库中执行禁用GUEST帐号的操作,这是因为许多用户都需要以GUEST身份访问master 和 tempdb系统数据库,GUEST用户在master 和 tempdb数据库的权限被严格限制。

3,dbo和db_owner的区别

dbo是一个user,能够对一个数据库执行任何操作。sa login,sysadmin角色的所有成员和数据库的Owner,都会以dbo身份登录到数据库 。由于dbo user是dbo schema的owner,因此dbo user创建的数据库对象的owner都是dbo。

db_owner是一个角色,它的成员不是dbo。如果一个用户是db_owner角色的成员,该角色具有操作数据库的所有权限,甚至包括删除数据库。

三,public 角色

public是一个服务器级别的角色,同时也是一个数据库级别的角色,注意,public角色的权限不是固定的,因此public 不属于固定角色(fixed role),在 sys.server_permissions 和 sys.database_principals的 字段 is_fixed_role 是 0。

  • 对于服务器级别的public角色,每一个login 都属于public 角色,当一个login没有被授予特定的权限时,那么该login会继承public的权限。
  • 对于数据库级别的public角色,每一个user都属于public 角色,当一个user没有被授予特定的权限时,那么该user会继承public的权限。

public角色特殊之处在于:角色的权限可以被修改。当一个login 或user没有被授予特定安全对象上的权限时,该login或user会继承public角色的权限。public 角色不能被删除,但是可以对public角色的权限进行授予(Grant)、拒绝(Deny)和回收(Revoke)。

默认情况下,有一些权限会被授予到public角色上,比如, VIEW ANY DATABASE 用于查看SQL Server实例上的所有数据库。

当对public角色进行权限管理时,一定要慎重,因为这会影响所有的login或user。通常情况下,不要把对public设置deny权限,这是由于deny语句的优先级最高,deny权限会覆盖所有的grant权限。

每个 SQL Server 的登录(Login)均属于 public 服务器角色,所有的数据库用户(User) 都属于public数据库角色。用户不能删除public角色,但是,可以授予或收回public角色的权限。默认情况下,public角色被分配很多权限,大部分权限都跟数据库中的日常操作有关。默认情况下,

  • 数据库级别的public 角色拥有的权限:查看特定系统表
  • 服务器级别的public 角色拥有的权限:查看数据库(VIEW ANY DATABASE),链接服务器(CONNECT)

当一个对象对所有用户或登录可用时,只需把权限分配给 public 角色即可。默认情况下,所有的数据库用户都属于public角色,因此,授予或回收public角色的权限,将会影响所有的用户。

参考文档:

Principals (Database Engine)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用 java.security 连接 SQL Server 数据库,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装 SQL Server,并且已经创建了一个数据库。 2. 导入所需的 JDBC 驱动程序。你可以在 Microsoft 官方网站上下载并安装适合你的 SQL Server 版本的 JDBC 驱动程序。 3. 在你的 Java 代码中导入所需的类和包。例如,你可能需要导入 `java.sql` 包中的类以及 SQL Server 的 JDBC 驱动程序提供的特定类。 4. 建立数据库连接。你需要提供正确的连接字符串、用户名和密码。连接字符串的格式通常是 `jdbc:sqlserver://<host>:<port>;databaseName=<database>;user=<username>;password=<password>;`,其中 `<host>` 是 SQL Server 的主机名或 IP 地址,`<port>` 是 SQL Server 的端口号(默认为 1433),`<database>` 是要连接的数据库名,`<username>` 和 `<password>` 是登录 SQL Server用户名和密码。 5. 执行 SQL 查询和更新操作。你可以使用 `java.sql.Connection` 和 `java.sql.Statement` 类来执行 SQL 语句。 以下是一个简单的示例代码,展示了如何连接到 SQL Server 数据库并执行一个查询: ```java import java.sql.*; public class SQLServerExample { public static void main(String[] args) { // 连接数据库 try { String connectionString = "jdbc:sqlserver://localhost:1433;databaseName=mydatabase;user=myusername;password=mypassword;"; Connection connection = DriverManager.getConnection(connectionString); // 执行查询 Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM mytable"); // 处理查询结果 while (resultSet.next()) { String column1 = resultSet.getString("column1"); int column2 = resultSet.getInt("column2"); // 处理每一行的数据 } // 关闭连接 resultSet.close(); statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 请记住,你需要根据你的实际情况进行适当的修改和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悦光阴

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值