热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

修改SQLServer2005执行环境

执行环境是SQLServer中设定用户权限的认证方式,例如,当您登录到SQLServer的时候,登录账户就被赋予了一定的权限,其中可能包括登录的功能、

执行 环境 是SQL Server中设定用户权限的认证方式,例如,当您登录到SQL Server的时候,登录账户就被赋予了一定的权限,其中可能包括登录的功能、访问数据库以及在数据库中 执行 某些操作的功能。 SQL Server 2005包含了EXECUTE AS语句,通过使用EXECUTE AS


执行环境是SQL Server中设定用户权限的认证方式,例如,当您登录到SQL Server的时候,登录账户就被赋予了一定的权限,其中可能包括登录的功能、访问数据库以及在数据库中执行某些操作的功能。

SQL Server 2005包含了EXECUTE AS语句,通过使用EXECUTE AS语句,您可以为批处理和过程转换执行环境,这样,调用该批处理或过程的用户就可以使用不同的权限来操作了。

所有权链

在我正式讲解SQL Server 2005中执行环境的问题之前,先来简单地说说所有权链的工作原理。

当用户执行一个存储过程的时候(假定该用户拥有执行该存储过程的权限),SQL Server将该存储过程的所有者与这个存储过程所涉及到的对象的所有者进行对比,如果他们的所有者相同,那么就不必对这些引用对象的权限进行评估了。

所以,如果用户Tim获得了存储过程usp_ProcedureChain的权限,而usp_ProcedureChain存储过程的所有者是dbo,那么,如果dbo还同时拥有usp_ProcedureChain所调用的其他存储过程,那么Tim在执行这个存储过程的时候就不会出现错误。

执行环境的转换

在SQL Server 2000中,您可以使用SETUSER命令来模拟SQL用户的执行环境,但问题在于,只有系统管理员或者数据库的所有者才能使用这个命令,而且Windows账户也不能使用该命令。

在SQL Server 2005中,EXECUTE AS语句可以替代SETUSER来改变存储过程、触发器、批处理或者函数的执行环境。如果执行环境变成了另外一个用户,那么SQL Server将检查该用户的权限。如果您需要在创建或修改一个存储过程或函数的时候指定EXECUTE AS语句,您需要具备IMPERSONATE的权限,以及创建该对象的权限。

实例

正如我刚才所介绍的一样,改变存储过程的执行环境非常有用,接下来我将通过实例来讲解如何实现这一功能。在这个例子中,您会看到如何使用EXECUTE AS将没有确切权限的使用者模拟为所有者对表格进行插入操作。

在第一行语句中,我使用了REVERT命令,这样,您就可以完整地返回到例子中,而不必担心需要清除任何对象。

REVERT
GO

在下面的代码的第七行,我使用了清除语句,这样可以检查我在随后的例子中要使用的对象是否已经存在,如果已经存在,就将其清除。

IF OBJECT_ID('usp_InsertMyTable','P')>0
DROP PROCEDURE usp_InsertMyTable
GO
IF OBJECT_ID('TableOwnerSchema.MyTable','U')>0
DROP TABLE TableOwnerSchema.MyTable
GO
IF EXISTS
(SELECT * FROM sys.schemas WHERE name = N'TableOwnerSchema')
DROP SCHEMA [TableOwnerSchema]
IF EXISTS
(SELECT * FROM sys.database_principals WHERE name = N'BaseUser')
DROP USER BaseUser
IF EXISTS
(SELECT * FROM sys.server_principals WHERE name = N'BaseUser')
DROP LOGIN BaseUser
IF EXISTS
(SELECT * FROM sys.database_principals WHERE name = N'TableOwner')
DROP USER TableOwner
IF EXISTS
(SELECT * FROM sys.server_principals WHERE name = N'TableOwner')
DROP LOGIN TableOwner

以下的脚本语句创建了两个登录名和数据库的用户账户,注意,CHECK_EXPIRATION和CHECK_POLICY语句,这两条语句是SQL Server 2005中新出现的。这些语句告诉SQL Server不要对这个用户账户强制执行密码截止期限策略,同时也不要进行任何类型的密码策略检查,对于强制安全策略而言,这些是非常有效的方法。

CREATE LOGIN [BaseUser] WITH PASSWORD=N'baseuser',
DEFAULT_DATABASE=[TRS],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
CREATE USER [BaseUser] FOR LOGIN [BaseUser]
GO
CREATE LOGIN [TableOwner] WITH PASSWORD=N'tableowner',
DEFAULT_DATABASE=[TRS],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
CREATE USER TableOwner FOR LOGIN TableOwner
GO

在SQL Server 2005中,模式不再是和数据库用户相同的事情了,对于所包含的对象而言,它处于完全不同的名称空间。用户和模式的分离是SQL Server 2005中的一大进步,这样做使对象的所有权可以分离,而且比SQL Server 2000更易于管理,以下的语句创建了我们将要使用的数据库模式:

CREATE SCHEMA [TableOwnerSchema] AUTHORIZATION [TableOwner]
GO
Now I enable logins so they can be used:
ALTER LOGIN [TableOwner] ENABLE
ALTER LOGIN [BaseUser] ENABLE
GO
GRANT CREATE TABLE TO TableOwner
GO

首先,我使用了EXECUTE AS命令,我将当前的执行环境设定为TableOwner,在运行了这个命令之后,所有的权限评估将以TableOwner运行,而以前的系统管理员权限将不再适用。

EXECUTE AS USER = 'TableOwner'
GO

运行这个语句就能够表明现在的执行环境是TableOwner:

SELECT SESSION_USER
GO

这个脚本将在TableOwnerSchema的模式中创建一个名为MyTable的表格,因为我已经赋予了该用户CREATE TABLE 的权限,所以TableOwner可以执行这条语句。

CREATE TABLE TableOwnerSchema.MyTable
(
Field1 INT
)
GO

当我运行REVERT语句的时候,可以在执行环境链中回退一步,在SQL Server 2005中,执行环境是可以嵌套的,所以如果您在同一个数据库连接中有很多用户在运行,您可能需要多次执行该语句以返回到原始的登录环境

REVERT
GO
SELECT SESSION_USER
GO

现在我要对新的表格进行快速选择以确认它的存在:

SELECT * FROM TableOwnerSchema.MyTable
GO

以下的脚本创建了一个过程可以插入新的TableOwnerSchema.MyTable表格,注意我在过程定义中使用了WITH EXECUTE AS 'TableOwner'语句,这意味着该过程被执行的时候,它将在TableOwner的执行环境中被执行

CREATE PROCEDURE usp_InsertMyTable
WITH EXECUTE AS 'TableOwner'
AS
BEGIN
INSERT INTO TableOwnerSchema.MyTable(Field1)VALUES(8)
END
GO

我还可以将执行权限赋予一个用户账户,在这种情况下,我使用以前创建的名为BaseUser的用户。

GRANT EXEC ON usp_InsertMyTable TO BaseUser
GO

接下来,我将执行环境转换为BaseUser并尝试运行存储过程:

EXECUTE AS USER = 'BaseUser'
GO
EXEC usp_InsertMyTable
GO

现在我可以向TableSchema.MyTable表格中添加记录了,因为在这个过程中TableOwner允许我这样做,而BaseOwner并没有明确的权限可以向该表格添加记录,所以该用户的任何尝试都会导致错误的发生。为了演示这个问题,可以运行以下的脚本,该脚本改变了我们刚才的过程,改为运行在调用者的执行环境中。

REVERT
GO
ALTER PROCEDURE usp_InsertMyTable
AS
BEGIN
INSERT INTO TableOwnerSchema.MyTable(Field1)VALUES(8)
END
GO
EXECUTE AS USER = 'BaseUser'
GO
EXEC usp_InsertMyTable
GO
REVERT

开发者和数据库管理员会发现在执行存储过程的时候转换权限非常有用,尤其是您处理TRUNCATE TABLE语句的时候,这个方法能帮上大忙,因为TRUNCATE TABLE并没有可以指定的权限。您可以将权限赋予将要进行截取表格操作的用户,然后在操作结束的时候再将原有的权限设定恢复就可以了。


推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • 如何在不同数据库中提取前N%的记录
    本文详细介绍了如何在SQL Server、Oracle和MySQL等不同数据库中提取前N%的记录。通过具体的示例和代码,帮助读者理解和掌握这些方法。 ... [详细]
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • 本文详细介绍了MySQL数据库服务器(mysqld)和客户端(mysql)的区别,并提供了多种启动和关闭MySQL服务器的方法。通过这些方法,您可以更好地管理和维护MySQL数据库。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • Oracle 用户锁定问题及解决方法
    本文介绍了如何在 Oracle 数据库中检查和处理用户锁定问题,包括查询被锁定的用户、解锁用户以及调整登录失败次数限制的方法。 ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
author-avatar
拟称2502902853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有