仅创建过程权限

2023-12-06

我在开发数据库中有 SQL Server 2008 的需求

  1. 只有 DBA(数据库所有者)才能创建、更改表。 开发人员不应创建或更改表。
  2. 开发人员可以创建/更改存储过程/用户定义函数 在 dbo 模式中并且可以执行 SP/UDF。
  3. 开发人员应该对表进行 SELECT、INSERT、DELETE、UPDATE( dbo 架构中的表

如何使用 GRANT 语句实现这一点


从Google找到了示例解决方案,但仍然有问题

CREATE LOGIN testdev WITH PASSWORD = 'sldkjlkjlkj 987kj//'

CREATE USER testdev

GRANT ALTER ON SCHEMA::dbo TO testdev
GRANT CREATE PROCEDURE TO testdev
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo TO testdev

CREATE TABLE mysig (a int NOT NULL)
EXECUTE AS USER = 'testdev'
go

CREATE PROCEDURE slaskis AS PRINT 12
go

CREATE TABLE hoppsan(a int NOT NULL) -- FAILS!
go

INSERT mysig (a) VALUES(123)
go

REVERT
go

DROP PROCEDURE slaskis
DROP TABLE mysig
DROP USER testdev
DROP LOGIN testdev

上面的语法能够阻止开发人员创建表,但不能阻止开发人员使用 SSMS 设计和更改表。

Thanks.


首先,我将使用角色而不是直接向用户授予访问权限。您可能已经这样做了,但我想我会提到它。

好的,这里的问题是向架构授予 ALTER 权限意味着被授权者可以对架构中的所有对象类型进行 ALTER 访问。不幸的是,据我所知,没有办法向特定对象类型授予权限,所以要么全部要么全无。相反,您不能向所有对象授予 ALTER,然后拒绝对特定对象类型的 ALTER。

我发现执行此操作的唯一方法是向架构授予 ALTER 权限,然后使用 DDL 触发器来控制角色可以执行的操作。

这是示例的更新版本,演示了原理:

--** Create a Developer Role
CREATE ROLE [Developer] AUTHORIZATION db_securityadmin;
GO

--** Grant view and execute on all SPs to Devloper
--GRANT VIEW DEFINITION ON SCHEMA::dbo TO [Developer];
GRANT CREATE PROCEDURE TO [Developer];
GRANT SELECT, INSERT, UPDATE, DELETE, ALTER, EXECUTE, VIEW DEFINITION ON SCHEMA::dbo TO [Developer]

--** Create user and login for testdev and add to the Developer role
CREATE LOGIN testdev WITH PASSWORD = 'sldkjlkjlkj987kj' 
CREATE USER testdev 
EXEC sp_addrolemember @rolename = 'Developer', @membername = 'testdev';
GO

--** Create DDL trigger to deny drop and alter to the Developer role
CREATE TRIGGER tr_db_DenyDropAlterTable_Dev 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
BEGIN 
   IF IS_MEMBER('Developer') = 1 
   BEGIN 
       PRINT 'You are not authorized to alter or drop a table.'; 
       ROLLBACK TRAN; 
   END; 
END; 
GO

--** Testing
CREATE TABLE mysig (a int NOT NULL) ;

EXECUTE AS USER = 'testdev'; 
GO

CREATE PROCEDURE slaskis AS PRINT 12; 
GO

CREATE TABLE hoppsan(a int NOT NULL); -- FAILS! 
GO

INSERT mysig (a) VALUES(123); 
GO

ALTER TABLE mysig ADD test INT; --** This will fail too
GO 

REVERT; 
GO

DROP PROCEDURE slaskis ;
DROP TABLE mysig ;
DROP USER testdev;
DROP LOGIN testdev;
DROP ROLE [Developer];
DROP TRIGGER tr_db_DenyDropAlterTable_Dev on DATABASE;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅创建过程权限 的相关文章

  • SQL Server 使用通配符加入并在第一个匹配处停止

    IF OBJECT ID tempdb TABLE1 IS NOT NULL DROP TABLE TABLE1 IF OBJECT ID tempdb TABLE2 IS NOT NULL DROP TABLE TABLE2 CREATE
  • SQL Server Express 到 .mdf 文件的连接

    两部分问题 我使用 VS 2015 Update 3 创建了一个 ASP NET MVC 5 应用程序 我在本地计算机上完成了该项目 突然 我无法再通过 SQL Server 对象资源管理器连接到 mdf数据库文件并出现以下错误 无法打开数
  • Quartz.NET 设置 MisfireInstruction

    我正在使用 Quartz NET 在 C 中工作 并且在 CronTrigger 上设置失火指令时遇到问题 我正在运行安装了 Quartz DB 的 SQL 后端 我有以下代码 可以很好地创建作业和运行调度程序 IScheduler sch
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • 在 Postgres 中的数组字段上应用聚合函数?

    是否可以对整数 字段 或其他数字数组 中的所有值应用聚合 如 avg stddev CREATE TABLE widget measurement integer insert into widget measurement values
  • 消息 102,级别 15,状态 1,第 1 行“ ”附近的语法不正确

    我试图从临时表中查询 但不断收到此消息 Msg 102 Level 15 State 1 Line 1 Incorrect syntax near 有人能告诉我问题是什么吗 是因为要转换吗 查询是 select compid 2 conve
  • SQL Server 差异工具

    在一个团队中工作时 人们很容易修改开发 SQL Server 表并忘记它 或者准备部署更改但必须等待部署 这使得我们的开发表和活动表不一致 从而在推送存储过程时导致问题 是否有一个工具可以让我输入 SPROC 名称并让它检查开发数据库和实时
  • 如何通过循环变量在 dbt 中多次运行 SQL 模型?

    我有一个 dbt 模型 测试模型 接受地理变量 zip state region 在配置中 我想通过循环变量来运行模型三次 每次使用不同的变量运行它 问题是 我有一个如下所示的宏 它将变量附加到输出表名称的末尾 即运行测试模型 with z
  • 如何在动态查询中将行值连接到列名

    我正在开发一个允许配置问题和答案的应用程序 目前最多可以有 20 个答案 但也可能更少 我的结构如下 问题 ID FormId QuestionText AnswerField 1 1 Name Answer01 2 1 Address A
  • 从一个sql服务器选择到另一个sql服务器?

    我想将一台服务器 Data Old S1 中的一个表 T1 在 DB1 中 中的数据选择到另一台服务器 Data Latest S2 中的另一个表 T2 在 DB2 中 中的数据 我怎样才能做到这一点 请注意服务器的命名方式 查询也应该考虑
  • 不是 select 中带有 MAX 的单组组函数

    Select sg gameno Max sg Year sg end sg hostcity country olympic name from Summergames s Country co where s country isoco
  • 这是过滤数据并防止 SQL 注入和其他攻击的安全方法吗?

    我创建了两个简单的函数来在插入数据进入 mysql 查询之前对其进行过滤 对于表单字段 我还使用正则表达式来单独检查每个字段 Form filter function filter var HTML is not allowed var s
  • MySQL 中的 UDF 性能

    我注意到 当查询在 SELECT 或 WHERE 子句中调用 UDF 时 MySQL 查询执行时间的性能会呈指数级下降 有问题的 UDF 查询本地表以返回标量值 因此它们不仅执行算术表达式 而且充当相关子查询 我通过简单地删除 UDF 并使
  • 使用 xmlagg 时出现子查询错误和太多值

    我在连接许多大型表中的所有数据时遇到问题 我昨天对此提出了问题 但不幸的是 listagg 似乎不是一个好的选择 链接子查询返回多行 https stackoverflow com questions 54651144 subquery r
  • SqlException超时未达到

    我们的服务器有时会抛出这个众所周知的异常 超时已过 操作完成之前超时时间已过 或者服务器未响应 当服务器处理大请求时 这种情况会在压力下发生 我做了一些研究 发现我可以改变连接字符串连接超时设置和 或SqlCommand 超时数据读取器属性
  • 如何对 SQL Server Express 进行实时更改

    我一直在使用 VS studio 开发一个 ASP NET Web 应用程序 我正在使用 SQL Server Express 在开发过程中 我一直在我的服务器上测试我的网络应用程序 每次我需要更新数据库时 我都会简单地删除旧数据库 位于我
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp
  • 计算树中值的总和(递归查询)

    我在表员工 id name parentid 中有树结构 并且该表可以嵌套 employees 与另一个具有列 id employeeid quantity 的 Sales 表是一对多关系 每个员工都有销售数量 我想计算每个员工以及儿童员工
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • 在 Navicat Premium 中连接到 LocalDB 服务器

    Recently I installed LocalDb Serer on my laptop I am trying to establish a connection between Navicat and LocalDB server

随机推荐

  • 如何使用 UIbarbuttonitem 发送电子邮件而不使用 MFMailComposerViewController

    我想使用 rightBarButtonItem 发送电子邮件 而不使用 MFMailComposeViewController 是否可以使用 barButtonItem 发送电子邮件 知道如何做到这一点吗 提前致谢 您将在此处找到关于已接受
  • Ruby 模块可以描述为单例类吗?

    我试图从设计模式的角度理解 Ruby 模块的用途 Ruby 模块本质上只是一个只初始化一次的类吗 include MyModule ruby 类是一个可以创建实例的模块 与类一样 模块可以有方法 但不能创建模块的实例 这是他们之间唯一的区别
  • Firebase 获取记录总数的更好方法

    来自交易文档第二段 这里的目的是让客户端增加总数量 发送的聊天消息 暂时忽略有更好的方法 实施这一点 有哪些标准的 更好的方法 来实现这一点 具体来说 我正在考虑尝试执行诸如检索最近 50 条记录之类的操作 这要求我从列表的末尾开始 所以我
  • 如何判断 tkinter 中的密钥是否已释放

    我使用此代码来测试是否按下了某个键 但我还需要一个在释放键时调用的绑定 如果不存在这样的绑定 我会选择一些代码来连续检查该键是否仍然被按下 w bind
  • SQLite FireDAC 尾随空格

    我使用 Delphi XE7 和 FireDAC 来访问 SQLite 当我将数据放入 TEXT 字段时 任何尾随空格或 0 字符都会被截断 我可以在 SQLite 或 FireDAC 中更改一些内容以使其保留尾随空白吗 The trail
  • iPhone SDK:从核心数据填充表视图

    我正在寻找一个教程 展示如何从核心数据填充 UITableView 允许添加记录和删除它们 我发现了一些项目 但如果没有构建它们的步骤 它们就很难遵循 有人看过这方面的教程吗 或者更好的是 视频 你看过吗NSFetchedResultsCo
  • 如何在 java 中添加 POI Workbook 作为 json 元素

    我已经在这个问题上苦苦挣扎了好几天了 我需要将 Apache poi Workbook 添加到 json 对象 我尝试了 Json org objectmapper 和 gson 库 对于所有经过测试的库 我的序列化方法都是相似的 例如 o
  • 除了减少混乱之外,还有什么理由清理 Java 中未使用的导入呢?

    在 Java 中是否有任何充分的理由避免未使用的 import 语句 据我了解 它们是供编译器使用的 因此大量未使用的导入不会对编译的代码产生任何影响 仅仅是为了减少混乱并避免命名冲突吗 我之所以这么问 是因为 Eclipse 会发出有关未
  • 整数转换排名和晋升

    阅读有关整数提升和整数转换等级的内容 我发现了这一点link 1 如果两个操作数具有相同的类型 则不需要进一步转换 2 否则 如果两个操作数都是有符号整数类型或都是无符号整数类型 则较小整数类型的操作数 转换等级转换为大于操作数的类型 秩
  • 如何加速移动设备 iOS/Android 的统一构建和运行过程 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 您好 我正在 Unity 中开发一款游戏 我需要在 iOS 中测试这款游戏 对于特殊情况 我需要测试控制器的输入触摸 但这需要很多时间 当我更改脚本 C 中的某些代码行时 我必须
  • Google 地图侦听器事件的行为类似于单击,即使它是鼠标悬停

    我添加这两个 google maps event addListener 事件 google maps event addListener markerAcademicCenter mouseover function e markerIc
  • 没有名为 ogr 的模块

    我正在尝试使用ogr模块 我尝试使用 pip 安装它 但出现错误 找不到满足要求的版本ogr 来自版本 找不到匹配的分布ogr 尝试安装包括 GDAL 在内的所有软件包 但仍然出现错误 没有名为的模块ogr 在谷歌上没有找到可行的解决方案
  • Highcharts 在 IE 中向 SVG 元素添加重复的 xmlns 属性

    我正在使用 Highcharts 在 PHP Web 应用程序中创建图表 问题是 在 IE 中 创建的 SVG 元素最终会出现重复的 xmlns 属性 在F12开发者工具 HTML选项卡中可以看到 click for larger vers
  • 表单提交后/表单提交错误时填写文件输入

    我有一个多部分表单 其中包含默认输入 文本 选择等 和文件上传
  • 使用 jspdf 时转换/规范化特殊字符

    尝试使用jspdf 库 1 4 1将文本转换为 pdf 时 输出有时会变得非常丑陋且难以阅读 因为文本包含一些特殊字符 例如 左边的单引号U 2018 或者正确的一个U 2019 或类似的符号 或者 in Kad k y 我如何清理 规范此
  • 如何在RecyclerView之间随机放置广告?

    我在用着快速适配器在我的应用程序中 我想在其中随机放置广告RecyclerView 例如 就像 3 点之后的广告RecyclerView然后是 4 之后的项目 然后是 2 之后的项目 依此类推 这就是我使用 FastAdapter 的方式
  • 如何获得使用System.Diagnostics.Process.GetProcess(string)的权限?

    我正在使用 Microsoft Visual Studio 制作一个简单的远程任务管理器以供体验 我想用Process GetProcesses string 但存在访问被拒绝的异常 不允许我获取远程计算机进程 事实上这是正常的 因为我们应
  • CertPathBuilderException:无法找到有效的证书路径是 8.5 网络部署

    我在 Websphere 8 5 上部署的 Web 应用程序 java 中有一个 Web 服务客户端 当我在 Web 服务的调用中将协议从 http 更改为 https 后 使用自签名证书部署 出现以下错误 javax net ssl SS
  • 使用 SHA1 和 RSA 与 java.security.Signature 对比 MessageDigest 和 Cipher

    我试图理解Java是什么java security Signature类确实如此 如果我计算 SHA1 消息摘要 然后使用 RSA 加密该摘要 我会得到与询问不同的结果签名类来签署相同的东西 Generate new key KeyPair
  • 仅创建过程权限

    我在开发数据库中有 SQL Server 2008 的需求 只有 DBA 数据库所有者 才能创建 更改表 开发人员不应创建或更改表 开发人员可以创建 更改存储过程 用户定义函数 在 dbo 模式中并且可以执行 SP UDF 开发人员应该对表