【SQL Sever】3. 用户管理 / 权限管理

1. 创建登录名/用户/角色

在SQL Server中,创建用户通常涉及几个步骤。
首先,你需要创建一个登录名,然后你可以基于这个登录名在数据库中创建一个用户
以下是如何做到这一点的步骤和相应的SQL语句:

  1. 创建登录名
    首先,你需要创建一个登录名。登录名允许用户连接到SQL Server实例。
USE [master];  
CREATE LOGIN [YourLoginName] WITH PASSWORD=N'YourPassword';

在这里,[YourLoginName] 是你希望为登录名指定的名称,YourPassword 是登录名的密码。

  1. 在数据库中创建用户
    一旦你有了登录名,你就可以在特定的数据库中基于这个登录名创建一个用户。
USE [YourDatabaseName];  
CREATE USER [YourUserName] FOR LOGIN [YourLoginName];

在这里,[YourDatabaseName] 是你希望在其中创建用户的数据库名称,[YourUserName] 是你希望为数据库用户指定的名称,而 [YourLoginName] 是你在第一步中创建的登录名。

  1. 为用户分配角色和权限
    你可能还想为用户分配特定的数据库角色或权限。例如,你可以将用户添加到 db_datareader 角色,以允许他们读取数据库中的数据:
USE [YourDatabaseName];  
EXEC sp_addrolemember N'db_datareader', N'YourUserName';

或者,你可以直接为用户授予或拒绝特定的权限:

USE [YourDatabaseName];  
GRANT SELECT ON [YourSchemaName].[YourTableName] TO [YourUserName];  

– 或者

DENY UPDATE ON [YourSchemaName].[YourTableName] TO [YourUserName];
  1. 创建角色并分配权限:
USE [YourDatabaseName];  
CREATE ROLE [YourRoleName];  
GRANT SELECT, INSERT, UPDATE ON SCHEMA::[dbo] TO [YourRoleName];

请注意,为了执行上述操作,你需要有足够的权限。通常,数据库管理员或具有适当权限的用户才能执行这些操作。

2. 登录名/用户/角色的区别

在 SQL Server 中,登录名(Login)、用户(User)和角色(Role)是安全模型中的关键组件,它们各自具有特定的功能和用途。下面是关于这些组件的简要说明:

登录名(Login)
登录名是用于连接到 SQL Server 实例的身份验证实体。它可以是 SQL Server 身份验证(使用用户名和密码)或 Windows 身份验证(使用 Windows 用户名和密码或组)的一部分。登录名确定了谁可以连接到 SQL Server,但并不直接确定在连接到特定数据库时可以执行哪些操作。

用户(User)
用户是与特定数据库相关联的安全主体。在 SQL Server 中,每个登录名在尝试连接到数据库时都需要一个相应的数据库用户。这个数据库用户可以是基于登录名的,也可以是基于其他安全主体的(例如其他数据库用户或 Windows 组)。用户决定了在特定数据库范围内可以执行哪些操作。

角色(Role)
角色是一组用户的集合,用于简化权限管理。通过将一组相关的权限分配给一个角色,然后将用户添加到该角色,您可以轻松地管理一组用户的权限,而不必单独为每个用户分配权限。SQL Server 提供了固定服务器角色(在服务器级别)和固定数据库角色(在数据库级别),但您也可以创建自定义的服务器角色和数据库角色来满足特定的需求。

关系和交互
登录名与用户的关系:通常,当您在 SQL Server 中创建一个登录名并希望该登录名能够访问某个数据库时,您需要在该数据库中为该登录名创建一个用户。这个用户与登录名相关联,并继承登录名的身份验证信息。
用户与角色的关系:用户可以被添加到一个或多个角色中。通过这样做,用户将继承角色所拥有的所有权限。这允许管理员通过管理角色来简化权限管理过程。
示例场景
假设您有一个名为 JohnDoe 的员工,您希望他能够连接到 SQL Server 实例并查询某个特定数据库中的数据。您可能会执行以下步骤:

在 SQL Server 实例上创建一个名为 JohnDoe 的登录名。
在目标数据库中创建一个与 JohnDoe 登录名相关联的用户。
将该用户添加到一个具有适当查询权限的数据库角色中(例如 db_datareader)。
这样,当 JohnDoe 使用其登录凭据连接到 SQL Server 并选择目标数据库时,他将能够执行该角色允许的所有操作(在本例中是查询数据)。

当我们创建登录名+密码后,就可以通过输入密码的方式,以该登录名登录数据库
当我们创建用户名后,想要访问数据库,需要在数据库下创建对应的用户名再赋予其数据库的权限,才能执行后续操作。

// 使用数据库
use scott;
// 创建用户名(在登录名login hacha下) 
create user hacha for login hacha;
// 赋予hacha 查权限
grant select on schema::[dbo] to hacha;

在这里插入图片描述
无法进行修改/增加等操作,因为没有权限
否则一直会报如下错误:

消息 15151,级别 16,状态 1,第 5 行
无法对 用户 'hacha' 执行 查找,因为它不存在,或者您没有所需的权限。

3. 查询当前用户的用户名

在SQL Server中,你可以使用CURRENT_USER或SYSTEM_USER函数来获取当前用户的用户名。
这些函数返回当前SQL Server会话的数据库用户名。

以下是查询当前用户名的SQL语句:

SELECT CURRENT_USER AS CurrentUserName;

或者

SELECT SYSTEM_USER AS CurrentUserName;

这两个函数在大多数情况下会返回相同的结果,但它们的语义略有不同:
CURRENT_USER返回当前执行上下文的数据库用户名。
如果在执行存储过程或触发器时更改了执行上下文(例如,使用EXECUTE AS),则CURRENT_USER可能会返回不同的值。
SYSTEM_USER返回与当前SQL Server会话关联的原始登录名。
它不会受到执行上下文更改的影响。
在大多数日常场景中,CURRENT_USER和SYSTEM_USER将返回相同的结果,因为它们都代表当前会话的用户。
然而,在涉及执行上下文更改的高级场景中,它们可能有所不同。

示例:
当您看到 CURRENT_USER 返回 dbo 而 SYSTEM_USER 返回 sa 时,这通常意味着:
您使用 sa 登录名登录到 SQL Server。
查询是在一个上下文中执行的,其中当前用户被映射为 dbo 用户。这可能是因为查询是从一个存储过程、触发器或使用了 EXECUTE AS 的其他上下文中执行的,或者是因为当前数据库的安全设置使得 sa 登录名被映射为 dbo 用户。
dbo 是一个特殊的数据库用户,通常拥有数据库中的大部分权限(尽管不是所有权限,特别是如果数据库启用了某些限制性的安全选项)。而 sa 是一个具有服务器范围内几乎所有权限的登录名。

如果你想要获取SQL Server登录名(而不是数据库用户名),你可以查询sys.dm_exec_sessions动态管理视图(DMV),结合sys.server_principals目录视图:

SELECT s.login_name   
FROM sys.dm_exec_sessions s   
WHERE s.session_id = @@SPID;

这里,@@SPID是一个系统函数,它返回当前会话的进程ID(session ID),sys.dm_exec_sessions包含有关当前服务器上所有会话的信息。

请注意,执行上述查询可能需要特定的权限,具体取决于你的SQL Server配置和角色成员资格。如果你没有足够的权限,你可能需要联系数据库管理员来获取所需的信息。

4. 给用户赋予数据库的权限

  1. 创建或确认用户存在
  2. 分配数据库权限
    一旦用户存在,你就可以给它分配数据库级别的权限了。这可以通过 GRANT 语句完成。

分配基本的数据操作权限(如 SELECT, INSERT, UPDATE, DELETE):

USE [YourDatabaseName];  
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::[dbo] TO [YourDatabaseUserName];

这将授予用户在 dbo 模式下对表进行基本的 CRUD 操作。
如果你想针对特定的表而不是整个模式进行授权,可以替换 SCHEMA::[dbo] 为具体的表名,例如 OBJECT::[dbo].[YourTableName]。

分配更高级别的权限(如 ALTER, EXECUTE):

USE [YourDatabaseName];  
GRANT ALTER, EXECUTE ON SCHEMA::[dbo] TO [YourDatabaseUserName];

这将允许用户修改模式和执行存储过程或函数。

分配数据库级别的权限(如 BACKUP DATABASE, CREATE TABLE):

USE [YourDatabaseName];  
GRANT BACKUP DATABASE, CREATE TABLE TO [YourDatabaseUserName];

这将允许用户备份数据库和创建新表。

  1. 考虑使用角色来管理权限
    为了简化权限管理,你可以考虑使用数据库角色。
    你可以创建自定义角色,将权限分配给这些角色,然后将用户添加到这些角色中。
    这样,当你需要更改用户的权限时,只需更改角色的权限即可,而不必单独修改每个用户的权限。

创建角色并分配权限:

USE [YourDatabaseName];  
CREATE ROLE [YourRoleName];  
GRANT SELECT, INSERT, UPDATE ON SCHEMA::[dbo] TO [YourRoleName];

将用户添加到角色:

USE [YourDatabaseName];  
EXEC sp_addrolemember N'YourRoleName', N'YourDatabaseUserName';

注意事项:
确保在执行这些操作时具有足够的权限。通常需要是 db_owner、db_securityadmin 或具有类似权限的用户。
仔细考虑授予的权限级别,避免授予不必要的权限,以减少潜在的安全风险。
在生产环境中更改权限之前,最好先在测试环境中验证更改的影响。

5. 查看当前SQL Sever登录名

在 SQL Server 中,要查看当前实例中存在的所有用户(登录名),你可以查询 sys.server_principals 系统视图。
这个视图包含了 SQL Server 实例中所有服务器级别的安全主体,包括登录名、服务器角色和应用程序角色。

以下是一个简单的 SQL 查询,用于列出 SQL Server 实例中的所有登录名(用户)

USE master;  
GO  SELECT name, type_desc   
FROM sys.server_principals   
WHERE type_desc IN ('SQL_LOGIN', 'WINDOWS_LOGIN', 'WINDOWS_GROUP', 'CERTIFICATE', 'ASYMMETRIC_KEY', 'EXTERNAL_LOGIN');

这个查询会返回所有类型的登录名,包括 SQL 登录名、Windows 登录名、Windows 组、证书登录名、非对称密钥登录名和外部登录名。如果你只对 SQL 登录名和 Windows 登录名感兴趣,可以进一步过滤 type_desc 的值。
如果你只想看 SQL 登录名和 Windows 登录名,可以使用以下查询:

USE master;  
GO  SELECT name, type_desc   
FROM sys.server_principals   
WHERE type_desc IN ('SQL_LOGIN', 'WINDOWS_LOGIN');

这个查询将只返回 SQL 登录名和 Windows 登录名。
请注意,执行这些查询通常需要具有足够的权限。如果你没有足够的权限,可能无法看到所有的登录名。在这种情况下,你可能需要联系你的数据库管理员来获取所需的信息。
此外,sys.server_principals 视图中的 type_desc 列描述了主体的类型。
例如,SQL_LOGIN 表示一个 SQL Server 登录名,而 WINDOWS_LOGIN 表示一个 Windows 登录名
通过查看这个列,你可以了解每个主体的类型。

6. SQLSever中有root账号吗?

在 SQL Server 中,并没有一个名为 “root” 的默认账号。
在 Unix 或 Linux 系统中,“root” 是超级用户账号,具有对系统的完全控制权。
但在 Windows 和 SQL Server 的环境中,概念略有不同。
在 SQL Server 中,拥有最高权限的账号通常是 sa(系统管理员)账号。
这个账号在 SQL Server 安装过程中创建,并具有对 SQL Server 实例的完全控制权。
与 Unix/Linux 中的 “root” 类似,sa 账号应该谨慎使用,并且其密码应该妥善保管,以防止未经授权的访问。
除了 sa 账号外,SQL Server 还支持 Windows 身份验证模式,其中 Windows 域或本地组的成员可以作为 SQL Server 的登录名。在这种情况下,具有适当 Windows 权限的用户或组可以拥有对 SQL Server 的访问权限。
如果你正在寻找具有高级权限的账号来管理 SQL Server,你应该考虑使用 sa 账号或具有适当权限的 Windows 用户或组。但是,请务必注意安全和权限管理的最佳实践,以避免潜在的安全风险。

7. 报错:无法对 用户 ‘hx’ 执行 查找,因为它不存在,或者您没有所需的权限。

使用 T-SQL 查询:你可以使用以下 T-SQL 查询来检查 ‘hx’ 用户是否存在:

sql
USE master;  
GO  SELECT name, type_desc   
FROM sys.server_principals   
WHERE name = 'hx';

如果查询返回了结果,那么 ‘hx’ 用户确实存在。如果查询没有返回任何结果,那么用户不存在,你需要创建它。

8. 不存在多行注释

在 SQL Server 中,没有像一些其他编程语言(如 C# 或 Java)那样的多行注释符号(例如 //)。
然而,你可以使用单行注释符号 – 来达到多行注释的效果,只需要在每一行前面都加上 – 即可。
例如:

-- 这是第一行注释  
-- 这是第二行注释  
-- 这是第三行注释  SELECT * FROM YourTableName; -- 这仍然是一个单行注释

如果你经常需要写多行注释,并且觉得上面的方法不够优雅或不够方便,你可以考虑使用存储过程或脚本来管理你的 SQL 代码,并在其中使用外部文本编辑器或 IDE 的多行注释功能。然后,你可以将编辑好的 SQL 代码复制到 SQL Server Management Studio (SSMS) 或其他查询工具中执行。
此外,一些第三方的 SQL 工具或插件可能提供了在 SQL Server 中使用多行注释的功能,但这不是 SQL Server 本身的功能。
如果你确实需要在 SQL Server 中处理大量的多行注释,并且想要更自动化的方式,你可能需要考虑使用版本控制系统(如 Git)和源代码编辑器(如 Visual Studio Code、SSMS 的插件等),它们通常都支持多行注释的添加和移除。

9. 报错:无法对 用户 ‘hx’ 执行 删除,因为它不存在,或者您没有所需的权限。

SELECT name, type_desc   
FROM sys.server_principals   
WHERE type_desc IN ('SQL_LOGIN', 'WINDOWS_LOGIN');drop user hx;

消息 15151,级别 16,状态 1,第 2 行
无法对 用户 ‘hx’ 执行 删除,因为它不存在,或者您没有所需的权限。

根据你提供的信息,你试图删除一个名为 ‘hx’ 的用户,但是收到了一个错误消息,提示 ‘hx’ 不存在或你没有足够的权限。

首先,drop user 语句在 SQL Server 中用于从特定数据库中删除用户,而不是从服务器级别删除登录名。
如果你尝试使用 drop user 来删除一个登录名,你会收到一个错误,因为登录名和用户是两个不同的概念。
登录名是在服务器级别定义的,而用户则是在数据库级别定义的,并与登录名关联。

在你之前的查询中,你使用 sys.server_principals 视图列出了所有的登录名,包括 SQL 登录名、Windows 登录名和 Windows 组。
结果显示 ‘hx’ 是一个 SQL_LOGIN 类型的登录名。
要删除一个登录名,你应该使用 DROP LOGIN 语句,而不是 DROP USER。
所以,你应该执行以下命令来删除 ‘hx’ 登录名:

USE master;  
GO  DROP LOGIN hx;  
GO

请注意,执行这个操作需要你有足够的权限。通常,只有 sysadmin 固定服务器角色的成员或具有相应权限的用户才能删除登录名。

如果你只是想从特定数据库中删除一个用户(假设该用户与 ‘hx’ 登录名关联),你需要首先确保你连接到了正确的数据库,然后执行类似以下的命令:

USE YourDatabaseName;  
GO  DROP USER [hx];  
GO

请替换 YourDatabaseName 为你想要从中删除用户的数据库名称。

在尝试删除任何对象之前,请始终确保你了解这些操作的后果,并且已经做好了适当的备份和恢复计划。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python零基础从小白打怪升级中~~~~~~~文件和文件夹的操作 (1)

第七节:文件和文件夹的操作 一、IO流(Stream) 通过“流”的形式允许计算机程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收的(sink)的有序数据。我们这里把输入/输…

企业鸿蒙原生应用元服务备案实操基本材料要求

一、要提前准备的主要材料包括 域名,服务器,包名,公钥,MD5值,法人身份证正反两面,邮箱,手机号2个。 域名是备案过的,应为要求域名能打开,还要悬挂备案号。 操作时要提前沟…

目标检测——瓶装白酒疵品检测数据集

一、重要性及意义 瓶装白酒疵品检测在白酒生产过程中具有极其重要的地位,其重要性和意义主要体现在以下几个方面: 首先,瓶装白酒疵品检测是保障消费者权益的关键环节。白酒作为消费者日常饮用的酒类之一,其品质直接关系到消费者…

【电控笔记4】拉普拉斯-传递函数-pid

数据标幺化 拉普拉斯变换 欧拉公式 常见s变换 s变换性质 pid分析 p控制,存在稳态误差 可以求出p的取值范围p>-1,否则发散 pi消除稳态误差 把kp换成Gs 只用pi控制,不加微分的原因: 微分之后,噪声增大高频噪声频率…

【研发管理】产品经理知识体系-数字化战略

导读: 数字化战略对于企业的长期发展具有重要意义。实施数字化战略需要企业从多个方面进行数字化转型和优化,以提高效率和创新能力,并实现长期竞争力和增长。 目录 1、定义 2、数字化战略必要性 3、数字战略框架 4、数字化转型对产品和服务设计的影响…

卷积通用模型的剪枝、蒸馏---剪枝篇(此处以deeplabv3+为例,可根据模型自行定制剪枝层)

之后的两篇文章是对前段时间工作的一个总结。 一、环境配置 1.1、文章以b导的代码为模板,环境配置比较简单(第二篇蒸馏篇结束后会放置剪枝蒸馏配置好的百度网盘链接),其他算法自行配置,在剪枝之前,需要保证算法能够在本地跑通。 B导链接: https://github.com/bubbliiiin…

行云堡垒国密算法应用与信创支持

一、 国密算法和信创的介绍 1.1 什么是国密算法 国密算法是国家密码管理局制定颁布的一系列的密码标准,即已经被国家密码局认定的国产密码算法,又称商用密码(是指能够实现商用密码算法的加密,解密和认证等功能的技术)…

.NET邮箱API发送邮件的流程?如何使用API?

.NET邮箱API发送邮件需要哪些步骤?怎么配置API发信? 电子邮件已经成为我们日常工作和生活中不可或缺的一部分。对于开发人员来说,掌握如何使用API发送邮件是一项非常实用的技能。AokSend将详细介绍使用.NET邮箱API发送邮件的流程&#xff0c…

机器学习和深度学习 -- 李宏毅(笔记与个人理解1-6)

机器学习和深度学习教程 – 李宏毅(笔记与个人理解) day1 课程内容 什么是机器学习 找函数关键技术(深度学习) 函数 – 类神经网络来表示 ;输入输出可以是 向量或者矩阵等如何找到函数: supervised Lear…

电感在 DC/DC 变换器中的作用及选型指南

消费类应用是现代 DC/DC 变换器需求的主要驱动力。在这类应用中,功率电感主要被用于电池供电设备、嵌入式计算,以及高功率、高频率的 DC/DC 变换器。了解电感的电气特性对于设计紧凑型、经济型、高效率、并具备出色散热性能的系统至关重要。 电感是一种…

3D模型可视化引擎HOOPS Visualize如何实现大型工厂可视化管理?

随着工业技术的不断发展,大型工厂的管理和运营面临着越来越多的挑战。为了提高效率、降低成本和优化生产流程,工厂管理者越来越倾向于采用先进的可视化技术来进行工厂管理。在这一领域中,3D模型可视化引擎HOOPS Visualize正发挥着越来越重要的…

Java项目:基于SSM+vue框架实现的人力资源管理系统设计与实现(源码+数据库+毕业论文+任务书)

一、项目简介 本项目是一套基于SSM框架实现的人力资源管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能…

数据结构排序之冒泡、快速、插入、选择、堆、归并等排序及时间,空间复杂度等(超详解,绝对能满足你的需求,并能学到很多有用知识)

在本文章开始之前给大家介绍个网站,可以通过下面动画网址来理解 ,(国外的网站帮助学习数据结构很多知识,可以翻译下来,在搜索框搜索相应的排序算法进行动画演示,非常好用。)​​​https://www.cs.usfca.edu/~galles/visualization/https://www.cs.usfca.edu/~galles/vis…

物联网实战--驱动篇之(七)RTC时钟(DS1302)

目录 一、RTC简介 二、DS1302介绍 三、初始化 四、字节读写 五、功能函数 一、RTC简介 实时时钟,简称RTC,这个在STM32的外设里也有,不过STM32F1系列的RTC实际上只有一个计数器功能,如果需要年月日要自己写软件计算 &#xff…

CDR2024破解序列号Crack免费下载最新CorelDraw2024安装包

CorelDRAW是一款功能强大的矢量图形制作和排版软件,主要面向绘图设计师和印刷输出人员。它提供了一整套的绘图工具,包括圆形、矩形、多边形、方格、螺旋线等,并配合塑形工具,可以对各种基本图形作出更多的变化,如圆角矩…

基于Lipschitz李式指数的随机信号特征识别和故障检测matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 Lipschitz李式指数定义与性质 4.2 Lipschitz李式指数的估计 4.3 Lipschitz李式指数在信号特征识别与故障检测中的应用 5.完整程序 1.程序功能描述 基于Lipschitz李式指数的随机信号特…

HD哈默纳科行星减速机:工业传动领域的卓越之选

HD哈默纳科行星减速机泛应用于各种工业领域的传动装置,以其卓越的性能和稳定的表现赢得了用户的广泛认可。HD哈默纳科行星减速机减速机具有结构紧凑、高减速比、高精度、负载能力强、耐久性好等诸多特点,使其在各类机械设备中发挥着至关重要的作用。 HD…

报表控件 Stimulsoft 常见问题:从代码启用缓存

Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能,Stimulsoft Ultimate包含了…

机器学习——概述总结

总图: 分部1: 分部2: 分部3:

代码随想录day37 | 贪心算法P6 | ● 738 ● 968 ● 总结

738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输…