首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Server:不授予sysadmin权限的存储过程EXECUTE AS子句

Server:不授予sysadmin权限的存储过程EXECUTE AS子句
EN

Stack Overflow用户
提问于 2014-10-27 17:05:09
回答 1查看 4.6K关注 0票数 4

我开发了一个存储过程,以便从备份文件中恢复数据库并向其添加应用程序用户。此存储过程属于主数据库。

问题是,我的IT部门不允许我使用管理用户,只允许我对sysadmin用户使用EXECUTE AS语句。

我可以恢复数据库,但无法找到在进程结束时添加用户的方法。

我使用的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE PROCEDURE [dbo].[myProc] 
@database VARCHAR(50)
WITH EXECUTE AS 'aSysAdminUser' 
AS
BEGIN
    --Restore the database (working)
    --Add the application user    (not working)                  
    SET @sqlScript = 'USE '+@database +';
    CREATE USER [myApplicationUser] FROM LOGIN [myApplicationUser];
    EXEC sp_addrolemember ''db_owner'', ''myApplicationUser'''
    EXEC(@sqlScript)
END

当我运行它时,我会收到以下错误消息:

服务器主体"aSysAdminUser“无法在当前安全上下文下访问数据库”数据库“。

知道如何使用EXECUTE AS语句从主db上的存储过程中创建动态参数db名称中的用户吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-27 18:53:54

您面临的问题是模拟的限制(即通过EXECUTE AS切换安全上下文)。对于数据库作用域对象,例如存储过程,您要在user子句中指定数据库级login,而不是服务器级login。因此,这个过程实际上并不是一个sysadmin。但是,有一种方法可以安全地授予这个存储过程真正的sysadmin权限,允许它在动态SQL中执行步骤,即:

  1. 连接到数据库
  2. 创建用户
  3. 改变角色

这样做的方法是通过使用证书对存储过程进行签名。然后,证书还将用于创建服务器级登录,该登录将添加到sysadmin服务器角色中。然后,当任何用户/登录(对此存储过程具有EXECUTE权限)执行此过程时,它将仅通过由同一证书签名来获取基于证书的登录的权限。

步骤1:[master]数据库中设置证书:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USE [master];
GO

CREATE CERTIFICATE [BackupRestoreCert]
    ENCRYPTION BY PASSWORD = N'MyPassword'
    WITH SUBJECT = N'Certificate for Managing Backup/Restore Operation Permissions';
GO

步骤2:创建登录并添加到sysadmin角色:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE LOGIN [BackupRestoreOps] FROM CERTIFICATE [BackupRestoreCert];

ALTER SERVER ROLE [sysadmin] ADD MEMBER [BackupRestoreOps];

步骤3:使用该证书对存储过程签名,创建指向新登录名的链接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ADD SIGNATURE
    TO [dbo].[myProc]
    BY CERTIFICATE [BackupRestoreCert]
    WITH PASSWORD = 'MyPassword';

以上所有这些实际上都是在[master]数据库的上下文中完成的,尽管对其进行分解似乎更容易理解。但是,在实践中,it人员只运行一次这个脚本。当然,如果ALTER存储过程,它们将不得不再次运行ADD SIGNATURE命令(即步骤3),因为对过程定义的任何更改都会丢失该命令。

就是这样。我已经用问题中显示的存储过程测试了这一点,一旦我添加了签名和sysadmin角色,就会创建用户并将其添加到db_owner角色中。

步骤4(可能):您可能可以从存储过程中删除EXECUTE AS子句。如果它传递的任何权限允许初始恢复操作工作,那么现在应该通过基于证书的登录来假设这些权限,因为它被标记为sysadmin

免责声明

我只想/需要清楚地表明,考虑到问题中指定的存储过程(正如所写的那样),一旦授予该权限,就会允许SQL注入。当然,这已经是IT人员决定使用EXECUTE AS子句向此存储过程授予sysadmin权限的初衷的结果。现在我只是指出,上述步骤实际上将使他们的预期行为成为现实。如果在动态SQL上有步骤,如果传入了数据库名称以外的任何内容,都会出错,那么很好,但是对于其他可能想要复制它并在不了解完整上下文的情况下复制/粘贴的人来说,仍然需要说明这一点。

应该做两件事:

  1. 虽然这是次要的一点,但是输入参数的数据类型应该是sysname (NVARCHAR(128)的别名),因为这是在[sys].[databases]中定义[name]的方式。
  2. 要做的主要工作是验证传入的值是一个现有的数据库名称,如下所示: 如果(DB_NAME(@ Database )为NULL)开始RAISERROR(N‘无效数据库名称,16,1);返回;

编辑:

为了不使用这样一个特权角色,我尝试找到了另一个允许这样做的服务器角色,它不是sysadmin。我试过dbcreatorsecurityadminserveradminsetupadmin,但不幸的是,它们都没有起作用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26599324

复制
相关文章
SQL 从查询结果里查询[通俗易懂]
我想要从从表中查出每天电动车和手机各自的销售总额。这个需求还是蛮简单的,仅仅须要依据createtime和product group by即可了。以下是我写的SQL语句:
全栈程序员站长
2022/07/20
2.8K0
SQL 从查询结果里查询[通俗易懂]
SQL模糊查询的四种匹配模式
表示任意0个或多个字符,可匹配任意类型和长度的字符。有些情况下是中文,需用两个百分号(%%)表示:
Leophen
2019/08/23
19.2K0
sql的嵌套查询_嵌套查询和嵌套结果的区别
SQL连接查询和嵌套查询详解 连接查询 若一个查询同时涉及两个或两个以上的表,则称之为连接查询。连接查询是数据库中最最要的查询,
全栈程序员站长
2022/09/22
4K0
sql的嵌套查询_嵌套查询和嵌套结果的区别
mybatis返回值_存储过程获取查询结果
以Map为最外层容器时就要加 @MapKey("id") 指定提取 id 作为 key。
全栈程序员站长
2022/11/09
2.1K0
《SQL Cookbook》 - 第二章 查询结果排序
1. 默认情况下,ORDER BY会做升序排列,因此ASC子句是可选的。可以通过DESC执行降序排列。可以再ORDER BY子句中列出不同的排序列,逗号分隔。
bisal
2021/09/06
1K0
linq to sql取出随机记录/多表查询/将查询出的结果生成xml
在手写sql的年代,如果想从sqlserver数据库随机取几条数据,可以利用order by NewId()轻松实现,要实现多表查询也可以用select * from A,B Where A.ID=B.ID做到,但这些功能到了linq to sql中如何实现呢? 关键点: 1.随机排序问题:可以用 Select(d=> new {NewId=new Guid()}).OrderBy(d=>d.NewId)达到order by NewId()的效果 2.多表查询 from a in TableA
菩提树下的杨过
2018/01/22
3.2K0
MyBatis查询结果resultType返回值类型详细介绍
比如根据某个字段获得数据库中的信息,把查询的结果信息封装成某个 JavaBean 类型的数据。
全栈程序员站长
2022/07/21
1.7K0
MyBatis查询结果resultType返回值类型详细介绍
Mysql常用sql语句(6)- limit 限制查询结果的条数
https://www.cnblogs.com/poloyy/category/1683347.html
小菠萝测试笔记
2020/06/09
2.5K0
Mysql常用sql语句(6)- limit 限制查询结果的条数
SQL查询和删除重复值的操作方法
如题,SQL查询和删除重复值,例子是在Oracle环境下,类似写法网上很多。 1、利用distinct关键字去重 2、利用group by分组去重(这里没有实验出来就不写了) 3、利用rowid查询去重(个人推荐这个,rowid查询速度是最快的)
用户8965210
2021/08/31
2.2K0
SQL聚合函数 SUM
SUM返回与expression相同的数据类型,但有如下异常:TINYINT、SMALLINT和INTEGER返回的数据类型都是INTEGER。
用户7741497
2022/03/27
1.4K0
SQL语句对查询结果集二次操作
如上所述: 如果是字段的话我们需要使用as起别名 查询的结果集是个集合,不是字段,所以不能用 as XXX来起别名 直接去掉as,使用别名即可
阮键
2020/06/19
1.4K0
SQL语句对查询结果集二次操作
sum 统计 SQL 实例
select sum(temp.times),sum(temp.c) from (select t.work_id releaserWorkId, t.real_name releaserName, t.nick_name releaserNickName, count(1) c, round(ifnull(sum(t.times),0),2) times from commonwealtime t where t.state =
一个会写诗的程序员
2018/08/17
5040
mysql——通过命令将sql查询的结果导出到具体文件
 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013045437/article/details/81275960
拓荒者
2019/03/15
1.8K0
mysql——通过命令将sql查询的结果导出到具体文件
SQL语句查询结果集中的动态修改案例(临时表+游标)
本文转载:http://www.cnblogs.com/Charles2008/archive/2008/03/04/1090314.html
跟着阿笨一起玩NET
2018/09/18
2.2K0
使用 WordPress Transients API 缓存复杂的 SQL 查询和运算结果
Transients 是瞬时的意思,WordPress Transients API 是 WordPress 用来缓存一些复杂的 SQL 查询和运算结果的最简单的方法。它给这些需要缓存的数据一个过期时间,并且时间一到就会自动删除。
Denis
2023/04/14
9680
使用 WordPress Transients API 缓存复杂的 SQL 查询和运算结果
php如何判断SQL语句的查询结果是否为空?
PHP与mysql这对黄金搭档配合的相当默契,但偶尔也会遇到一些小需求不知道该怎么做,例如今天要谈到的:如何判断sql语句查询的结果集是否为空!
Yiiven
2022/12/15
3.6K0
SQL使用(一):如何使用SQL语句去查询第二高的值
初看了一眼题时,脑子还有一点迷糊,对于数值最大的和最小的,可以使用max和min去查询出来,但对于第N的就不好找了,思考了一会儿了,心里大致有二个思路:
王豆豆
2020/07/24
5.8K0
SQL使用(一):如何使用SQL语句去查询第二高的值
Mysql常用sql语句(10)- is null 空值查询
https://www.cnblogs.com/poloyy/category/1683347.html
小菠萝测试笔记
2020/06/09
4.4K0
Mysql常用sql语句(10)- is null 空值查询
sql 再not in 子查询有null值的奇怪现象
–如果null参与算术运算,则该算术表达式的值为null。(例如:+,-,*,/ 加减乘除)
斯文的程序
2019/11/07
1.8K0
分批拼接SQL IN 查询需要的ID字段值,解决IN 查询的ID过多问题
SQL查询使用的IN条件字段很多的时候,会造成SQL语句很长,大概SQL语句不能超过8K个字符,也有说IN不能超过1000个条件,总之太长了不行,需要拆分条件分批处理。下面提供一个将Int类型的条件字段值进行字符串拼接的方法。看代码:
用户1177503
2021/04/01
2.5K0

相似问题

列值匹配时的SQL sum字段

20

SQL查询如何减去不同SQL查询的结果?[Sum()的反向减法]

16

SQL Money Sum上的错误结果值

17

基于嵌套查询结果的Oracle SQL - SUM数据

13

SQL SUM查询返回结果中的重复行。

410
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文