拒绝了对对象 'admin' (数据库 'db_gxjyt',架构 'dbo')的 SELECT 权限

本文详细介绍了如何解决在SQL Server中遇到的SELECT权限被拒绝的问题。通过数据库的安全性设置,调整架构'dbo'下的权限分配,确保'public'角色拥有正确的SELECT权限。

服务器 --〉属性 --〉安全性 --〉sql server 和windows 认证模式
问题: 拒绝了对对象 ‘xxx’ (数据库 ‘xxx’,架构 ‘dbo’)的 SELECT 权限。
答案: 数据库(xxx) —>安全性---->架构---->dbo(属性)—>权限—>添加—>浏览–>public 添加 select

<think> 我们被要求将SQL Server数据库用户的只读权限更改为更新权限(即允许更新数据)。根据引用内容,我们知道在SQL Server中权限管理有两种主要方式:使用预定义角色和分配细粒度权限。 引用[2]提供了使用预定义角色的示例,其中提到了几个角色: - db_datareader:可以查询所有表的数据(只读) - db_datawriter:可以插入、更新、删除所有表的数据(写权限) - db_owner:数据库所有者,拥有所有权限 - ddl_admin:可以管理数据库结构(如创建、修改表),但没有数据权限 因此,如果用户原本只有只读权限(可能是通过添加到db_datareader角色),现在需要更新权限,我们可以考虑将其添加到db_datawriter角色。这样,该用户将拥有对所有表的插入、更新和删除权限。 但是,请注意:db_datawriter角色允许用户更新所有表的数据。如果只需要更新特定表,则需要使用细粒度权限控制(引用[2]中提到的“方式二”)。 另外,引用[3]提供了使用GRANT语句赋予特定权限的示例: grant select/update/delete on TABLEA/VIEWB to test 因此,根据用户的具体需求(是整个数据库的所有表还是特定表),我们可以选择不同的方法。 步骤: 方法一:使用预定义角色(适用于整个数据库的所有表) 1. 将用户从db_datareader角色中移除(如果之前只分配了只读权限,可能只在这个角色中,但注意用户可能同时属于多个角色)。 2. 将用户添加到db_datawriter角色(这样用户就有了更新权限,同时如果还需要只读权限,则保留在db_datareader中;如果只需要更新不需要读,则移除db_datareader,但通常读写会同时需要)。 方法二:使用细粒度权限(适用于特定表) 1. 对每个需要更新权限的表,使用GRANT语句赋予UPDATE权限(还可以包括INSERT和DELETE,如果需要的话)。 注意:更新权限通常包括INSERT、UPDATE和DELETE。如果用户原本有SELECT(只读)权限,现在需要增加更新权限,则我们只需添加更新权限,而保留原有的SELECT权限。 具体操作: 方法一:使用预定义角色(整个数据库的更新权限) 步骤1:检查用户当前的角色成员资格,如果用户已经在db_datawriter角色中,则无需操作。如果不在,则添加。 步骤2:如果用户之前只被赋予了db_datareader(只读),现在需要更新权限,我们通常不会移除db_datareader,因为更新数据的同时通常需要读取数据。所以,我们只需添加db_datawriter。 示例代码: ```sql USE [YourDatabase]; -- 切换到目标数据库 GO -- 将用户添加到db_datawriter角色,使其具有所有表的插入、更新、删除权限 ALTER ROLE db_datawriter ADD MEMBER [UserName]; ``` 这里的[UserName]是要更改权限数据库用户名。 方法二:细粒度权限(针对特定表) 如果只需要对特定表赋予更新权限,我们可以使用GRANT语句: ```sql USE [YourDatabase]; GO -- 授予对指定表TableName的UPDATE权限 GRANT UPDATE ON [SchemaName].[TableName] TO [UserName]; -- 如果需要,还可以授予INSERT和DELETE权限 GRANT INSERT ON [SchemaName].[TableName] TO [UserName]; GRANT DELETE ON [SchemaName].[TableName] TO [UserName]; ``` 注意:如果用户之前只有SELECT权限,现在需要更新权限,我们只额外添加更新权限即可,不需要收回SELECT权限。 另外,如果用户之前是通过被授予SELECT权限(而不是通过db_datareader角色)获得的只读权限,那么我们就不能通过角色来管理,而需要单独授予更新权限。 在实际操作中,我们需要知道用户当前的权限设置。可以通过查询系统视图来查看,但这可能比较复杂。通常,如果之前是通过预定义角色分配的,那么使用方法一修改比较方便;如果之前是细粒度分配的,则对应使用方法二。 总结: 根据引用内容,我们可以通过两种方式来实现将只读权限更改为更新权限: 1. 使用预定义角色db_datawriter(整个数据库的所有表) 2. 使用GRANT语句针对特定表授予UPDATE、INSERT、DELETE权限。 根据用户的具体需求选择合适的方法。 注意:权限更改后,用户需要重新连接才能生效吗?实际上,权限更改是实时生效的,但有些设置(如角色成员资格更改)可能需要用户重新登录,因为权限在登录时缓存。为了确保权限生效,建议用户重新连接。 最后,提醒:赋予更新权限可能会带来数据安全风险,请谨慎操作。 相关问题: §§相关问题§§ 1. SQL Server中如何查看一个用户的当前权限? 2. 如何撤销SQL Server用户的更新权限? 3. 在SQL Server中,如何为不同表设置不同的更新权限? </think> ### SQL Server数据库将只读权限更改为更新权限的方法 在SQL Server中,将用户从只读权限变更为更新权限有两种主要方式,具体取决于您需要的控制粒度。以下是详细操作步骤: #### 方法一:使用预定义角色(快速分配) 1. **移除只读角色**: ```sql USE [YourDatabase]; GO ALTER ROLE db_datareader DROP MEMBER [UserName]; -- 移除只读权限 ``` 2. **添加更新权限角色**: ```sql ALTER ROLE db_datawriter ADD MEMBER [UserName]; -- 授予增删改权限 ``` *说明*: - `db_datawriter` 角色允许用户对所有表执行 INSERT/UPDATE/DELETE 操作[^2] - 若需保留查询权限,需额外添加:`ALTER ROLE db_datareader ADD MEMBER [UserName]` - 适用于需要全局更新权限的场景 #### 方法二:细粒度权限控制(精确到表) ```sql USE [YourDatabase]; GO -- 授予特定表的更新权限 GRANT INSERT, UPDATE, DELETE ON [SchemaName].[TableName] TO [UserName]; -- 示例:授予Employees表的完整更新权限 GRANT INSERT, UPDATE, DELETE ON dbo.Employees TO TestUser; ``` *关键点*: 1. 使用 `GRANT` 命令精确控制权限[^3] 2. 权限类型说明: - `INSERT`:添加新数据 - `UPDATE`:修改现有数据 - `DELETE`:删除数据 3. 可通过 SSMS 图形界面操作: `对象资源管理器 → 数据库 → 表 → 右键属性 → 权限页签`[^3] #### 权限组合示例 | 权限需求 | 操作方式 | |----------------|--------------------------------------------------------------------------| | 只读 → 读写 | `ADD MEMBER db_datareader, db_datawriter`[^2] | | 只读 → 仅更新 | `DROP MEMBER db_datareader` + `GRANT UPDATE ON 表名 TO 用户` | | 限制特定表更新 | `GRANT UPDATE ON 关键表 TO 用户` + `DENY UPDATE ON 敏感表 TO 用户` | #### 验证步骤 ```sql -- 检查用户权限 EXEC sp_helprotect NULL, 'UserName'; -- 查看角色成员 SELECT r.name AS RoleName, m.name AS MemberName FROM sys.database_role_members rm JOIN sys.database_principals r ON rm.role_principal_id = r.principal_id JOIN sys.database_principals m ON rm.member_principal_id = m.principal_id WHERE m.name = 'UserName'; ``` > **重要提示**:权限变更后,用户需重新登录生效。敏感操作建议通过角色管理而非直接赋权用户[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值