msdb
MSDB是Microsoft SQL Server中一个系统数据库,它存储了SQL Server代理作业,备份和还原,数据库维护计划,邮件,日志和数据库相关的其他信息。MSDB数据库包含了许多系统表和视图,例如sysjobs、sysjobhistory、sysoperators等,这些表和视图可以帮助管理员和开发人员查看和管理SQL Server代理作业、备份和还原、数据库维护计划等。MSDB数据库是SQL Server中非常重要的一个系统数据库,如果它出现问题,可能会导致SQL Server无法正常运行。
不显示。。。
用户权限
在 Microsoft SQL Server 中,可以使用以下两种方式来查看用户的权限:
-
使用 SQL Server Management Studio (SSMS):
- 打开 SSMS 并连接到 SQL Server 实例。
- 在对象资源管理器中,展开“安全性”文件夹。
- 选择“登录名”文件夹,右键单击要查看权限的用户,并选择“属性”。
- 在“属性”对话框中,选择“用户映射”页面。
- 在页面上方的“已分配的数据库角色”和“已分配的架构”部分,可以查看用户在每个数据库中所分配的角色和架构。
-
使用系统存储过程:
- 打开 SQL Server Management Studio 并连接到 SQL Server 实例。
- 新建一个查询窗口,输入以下代码并运行:
SELECT name FROM sys.databases USE [database_name] GO EXEC sp_helprotect NULL, 'username' GO
此处的
database_name
是要查看的数据库名称,username
是要查看权限的用户名称。运行后,将会列出用户在该数据库中的所有权限。
OWNER 权限
在 Microsoft SQL Server 中,OWNER 权限是一种数据库级别的权限,它授予用户或角色对数据库的完全控制权,包括对所有对象的 SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER 和 DROP 等权限。具有 OWNER 权限的用户或角色可以执行以下操作:
- 创建、更改和删除数据库对象,如表、视图、存储过程、触发器等。
- 分配、更改和删除其他用户或角色的权限,包括对对象的 SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER 和 DROP 等权限。
- 在数据库中执行任何操作,包括备份和还原。
通常情况下,只有数据库管理员或拥有数据库的所有权的用户才会被授予 OWNER 权限。但是,需要注意的是,授予过多的权限可能会增加安全风险,并可能导致数据泄露或损坏。因此,在授予 OWNER 权限之前,应该进行仔细的评估和授权。
权限授权记录
这是一种 SQL Server 数据库中的权限授权记录,它包含以下字段:
- Owner:授权的所有者,即授予权限的用户或角色。
- Object:被授权的对象,如表、视图、存储过程、触发器等。
- Grantee:被授权的用户或角色。
- Grantor:授予权限的用户或角色。
- ProtectType:保护类型,指定授予权限的安全级别,包括 GRANT、DENY 和 REVOKE。
- Action:被授权的操作,如 SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER 和 DROP 等。
- Column:被授权的列,即被授权的操作所涉及的列。
这种授权记录可以帮助管理员和开发人员查看和管理数据库对象的权限,包括谁拥有对特定对象的权限、授权者是谁、被授权者是谁、授权的操作是什么等信息。通过这些信息,管理员和开发人员可以更好地控制数据库的安全性,并确保只有授权的用户或角色才能访问和修改数据库对象。
有两个授权是针对特殊的CDC(Change Data Capture)操作的,其中一个是允许禁用CDC,另一个是允许启用CDC。此外,还有一些授权是针对连接数据库的权限。
两个授权是针对备份操作的,即拒绝了bpx用户对数据库备份和事务备份的操作权限。
另一个授权是允许bpx用户连接数据库,但没有指定具体的操作权限。
这些授权可以限制不同用户对数据库的操作,从而保证数据库的安全性和完整性。
用户权限 (只读 VS 读写)
在 MSSQL 中,只读用户和读写用户的区别在于其对数据库的操作权限。只读用户只能读取数据库中的数据,而不能修改或删除数据,而读写用户则可以读取、修改和删除数据。
您可以使用以下语句来查看当前用户的权限:
SELECT HAS_PERMS_BY_NAME(DB_NAME(), 'DATABASE', 'SELECT') AS 'Select Permission', HAS_PERMS_BY_NAME(DB_NAME(), 'DATABASE', 'INSERT') AS 'Insert Permission', HAS_PERMS_BY_NAME(DB_NAME(), 'DATABASE', 'UPDATE') AS 'Update Permission', HAS_PERMS_BY_NAME(DB_NAME(), 'DATABASE', 'DELETE') AS 'Delete Permission'
这将返回一个包含当前用户在当前数据库中具有的 SELECT、INSERT、UPDATE 和 DELETE 权限的结果集。如果只读用户没有 UPDATE 和 DELETE 权限,则他们无法修改或删除数据。
读写
只读
这个错误通常是因为要切换到的用户不存在或者当前用户没有足够的权限来模拟要切换到的用户。您可以按照以下步骤来解决这个问题:
-
确认要切换到的用户存在。您可以使用以下命令来检查要切换到的用户是否存在:
SELECT name FROM sys.server_principals WHERE name = 'bpx2';
如果返回结果为空,则表示要切换到的用户不存在。
-
确认当前用户有足够的权限来模拟要切换到的用户。您可以使用以下命令来检查当前用户是否有足够的权限:
SELECT * FROM fn_my_permissions(NULL, 'SERVER');
如果返回结果中没有“IMPERSONATE”权限,则表示当前用户没有足够的权限来模拟要切换到的用户。
-
如果要切换到的用户存在,并且当前用户有足够的权限来模拟要切换到的用户,则可能是因为要切换到的用户是一个 Windows 身份验证登录,而不是 SQL Server 身份验证登录。在这种情况下,您需要使用以下命令来切换到 Windows 身份验证登录:
EXECUTE AS LOGIN = 'domain\username';
其中,
domain\username
是要切换到的 Windows 身份验证登录的名称。注意:您需要在 SQL Server 中启用“身份验证模式”为“混合模式”,才能使用 Windows 身份验证登录。
sqlcmd如何切换用户
在 MSSQL 中使用 sqlcmd 切换用户,可以按照以下步骤操作:
-
打开命令提示符或 PowerShell。
-
输入以下命令连接到 MSSQL 服务器:
sqlcmd -S server_name\instance_name -U current_user -P current_password -d database_name
其中,
server_name\instance_name
是 MSSQL 服务器的名称和实例名称,current_user
是当前登录用户的用户名,current_password
是当前登录用户的密码,database_name
是要连接的数据库名称。 -
输入以下命令切换到另一个用户:
EXECUTE AS LOGIN = 'new_user';
其中,
new_user
是要切换到的用户的登录名。 -
输入以下命令执行操作:
SELECT * FROM table_name;
其中,
table_name
是要查询的表名。 -
输入以下命令退出新用户身份:
REVERT;
-
输入以下命令退出 sqlcmd:
EXIT;
如何查看登录的用户Or数据库
在 MSSQL 中使用 sqlcmd 查看当前登录的数据库和用户,可以按照以下步骤操作:
-
打开命令提示符或 PowerShell。
-
输入以下命令连接到 MSSQL 服务器:
sqlcmd -S server_name\instance_name -U current_user -P current_password -d database_name
其中,
server_name\instance_name
是 MSSQL 服务器的名称和实例名称,current_user
是当前登录用户的用户名,current_password
是当前登录用户的密码,database_name
是要连接的数据库名称。 -
输入以下命令查看当前登录的数据库:
SELECT DB_NAME() AS [Current Database];
这将返回当前登录的数据库名称。
-
输入以下命令查看当前登录的用户:
SELECT SUSER_SNAME() AS [Current User];
这将返回当前登录的用户的登录名。
-
输入以下命令退出 sqlcmd:
EXIT;
sqlcmd如何执行换行的sql语句
在 SQL Server Management Studio (SSMS) 中,我们可以使用换行符来编写多行 SQL 语句。但是,在使用 sqlcmd 命令行工具时,我们需要在 SQL 语句的结尾处添加特殊字符,以指示 sqlcmd 该语句未结束。
以下是几种在 sqlcmd 中编写多行 SQL 语句的方法:
- 使用“GO”关键字分隔 SQL 语句:
SELECT * FROM my_table
GO
UPDATE my_table SET column1 = 'value'
GO
- 在 SQL 语句的结尾处添加“\”字符:
SELECT * FROM my_table \
WHERE column1 = 'value'
- 在 SQL 语句的结尾处添加“;”字符:
SELECT * FROM my_table;
UPDATE my_table SET column1 = 'value';
需要注意的是,以上方法中的“GO”关键字和“\”或“;”字符必须单独一行,否则 sqlcmd 可能无法正确解析 SQL 语句。
在使用 sqlcmd 命令行工具时,可以将上述 SQL 查询语句保存到一个 .sql 文件中,然后使用以下命令执行该文件:
sqlcmd -S server_name -d database_name -i file_path.sql -o output_file.txt
其中,-S 参数指定 SQL Server 实例的名称,-d 参数指定要查询的数据库名称,-i 参数指定包含 SQL 查询语句的文件路径,-o 参数指定输出结果的文件路径和名称。
例如,如果要在名为 MyServer 的 SQL Server 实例上查询名为 MyDatabase 的数据库中所有用户的权限,并将结果保存到名为 output.txt 的文件中,可以使用以下命令:
sqlcmd -S MyServer -d MyDatabase -i C:\query.sql -o C:\output.txt
其中,C:\query.sql 是包含 SQL 查询语句的文件路径,该文件包含上述 SQL 查询语句。