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

本文详细介绍了在SQL Server中遇到权限错误时的具体解决方案,包括使用Windows身份验证设置权限,为public角色分配数据库和表级别的权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网上看了很多资料都是空说一谈,都只是说很简单,然后没有说遇到这样的情况具体该怎么做,看到这里都知道是权限问题,其实我们每一个人都知道,又是我觉得我还是要给以后遇到的朋友个解决方法:

这里用到的数据库是08版本的(2012及其他版本原理一样,方法同样适用),出现了这种一直报权限错误,错误截图如下:

所见效果描述:在windows身份验证的 情况下登陆进去数据库的表都是可以打开的,当换到sa或者别的账号登陆进去的时候这个时候我们点击我们的数据库就会报错:

 解决方法如下:

  1、首先我们要用windows身份登陆进去进行设置,因为你的sa等账号登陆进去设置都是无效的【这一步很重要】。

  2、找到对应的库下面的安全性->架构->dbo->右键属性【权限】->搜索->浏览【public】->确定,在右边的具有授权,如果不知道的情况下全部打钩即可。参照截图如下:

  3、如果这个时候还是用sa或者别的账号可以登陆了,进去之后右键编辑表错误,那么这个时候你就需要进行下面的设置了。

  4、windows登陆进去选择表右键属性【权限】->搜索->浏览【public】->确定,在右边的具有授权,如果不知道的情况下全部打钩即可。参照截图如下,最终完美解决问题。效果如下图所示:

 

<think>嗯,用户问的是在SQL Server数据库中,用barcode='0000004043'这个条件查pinghengMark表,结果查不出来。为什么会这样呢?首先,我需要考虑可能的原因有哪些。 首先想到的是数据是否存在。可能根本没有这条数据。用户可能误以为存在,或者数据被删除了。需要确认一下是否有这条记录。或者可能是输入错误,比如barcode的值有空格或者其他不可见字符,导致查询条件不匹配。 然后考虑字段类型的问题。如果barcode字段是数值类型,比如int或者numeric,而查询时用了字符串的'0000004043',可能会隐式转换,导致前面的零被忽略,实际存储的是4043,而不是0000004043。这时候查询就会找不到结果。 还有可能是大小写敏感的问题。如果数据库的排序规则是区分大小写的,而barcode的值中有大写字母或者其他情况,但查询时用的是小写,也可能导致不匹配。不过一般来说,数字类型的条码不会有大小写的问题,但如果是字符类型的话,还是有可能的。 另外,空格或者特殊字符的问题。可能在数据中barcode字段的值前后有空格,或者其他不可见字符,比如换行符或者制表符,这时候直接等值查询可能无法匹配。需要用TRIM函数或者LIKE来模糊查询。 还有可能是事务未提交。比如这条数据是在一个未提交的事务中插入的,当前查询的隔离级别下看不到这条数据。或者使用了脏读之外的隔离级别,导致无法读取未提交的数据。 此外,还有可能是表名或列名拼写错误。用户可能写错了表名pinghengMark,或者列名barcode,比如大小写不一致或者有空格,特别是在使用引号的情况下。 还要考虑是否有索引或统计信息的问题,导致查询优化器选择了错误的执行计划,但这种情况比较少见,通常不会导致完全查不到数据,只是性能问题。 然后,用户之前的问题是关于SQL Server缓存机制的设置,现在突然问查询不到数据的问题,可能用户在实际工作中遇到了这个问题,正在排查原因。用户可能已经确认过数据存在,但仍然查不到,所以需要更深入的原因分析。 可能需要分步骤指导用户如何排查:首先确认数据是否存在,检查字段类型,检查是否有空格或不可见字符,检查排序规则,检查事务状态,以及确认对象名是否正确。 另外,用户可能没有意识到隐式转换的问题,特别是当字段是数值类型时,字符串中的前导零会被忽略,导致查询条件不匹配。这时候需要将字段转换为字符串类型再比较,或者修改查询条件。 还有可能,barcode字段是varchar类型,但存储的值包含了其他字符,比如在末尾有空格,导致等值查询失败。这时候用LIKE或者加上通配符可能会查到。 总结起来,可能的原因包括数据不存在、字段类型不匹配、存在空格或特殊字符、排序规则问题、事务隔离级别、对象名错误等。需要逐一排查这些可能性,帮助用户找到问题所在。</think>在SQL Server中执行`SELECT * FROM pinghengMark WHERE barcode='0000004043'`无返回结果,可能由以下原因导致,请按以下步骤排查: --- ### **一、数据层面原因** 1. **数据真实不存在** ```sql -- 验证数据存在性(精确匹配) SELECT COUNT(*) FROM pinghengMark WHERE barcode = '0000004043' COLLATE Chinese_PRC_CS_AS; -- 强制区分大小写 ``` - 若返回0,则目标数据未存储 2. **隐式空格/特殊字符** ```sql -- 模糊匹配检测(包含不可见字符) SELECT * FROM pinghengMark WHERE barcode LIKE '%0000004043%' AND LEN(barcode) > LEN('0000004043'); ``` - 若返回结果,说明存在前导/尾随空格或特殊字符 --- ### **二、字段类型问题** 1. **数值类型字段的零填充问题** ```sql -- 检查字段类型 SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'pinghengMark' AND COLUMN_NAME = 'barcode'; ``` - 若为`numeric`/`int`类型,存储值实际为`4043`而非`0000004043` - 解决方案: ```sql -- 显式转换为字符串比较 SELECT * FROM pinghengMark WHERE CAST(barcode AS VARCHAR(20)) = '0000004043'; ``` 2. **字符集不匹配** ```sql -- 检查字段排序规则 SELECT name, collation_name FROM sys.columns WHERE object_id = OBJECT_ID('pinghengMark') AND name = 'barcode'; ``` - 若为`Chinese_PRC_CS_AS`(区分大小写),需严格匹配大小写 --- ### **三、事务隔离问题** 1. **未提交事务影响** ```sql -- 查看当前活动事务 DBCC OPENTRAN; ``` - 若存在未提交事务,可使用`READ UNCOMMITTED`隔离级别: ```sql SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM pinghengMark WHERE barcode = '0000004043'; ``` --- ### **四、对象定位问题** 1. **架构限定缺失** ```sql -- 确认完整对象路径 SELECT * FROM [dbo].[pinghengMark] -- 默认架构dbo WHERE barcode = '0000004043'; ``` - 当表属于非默认架构时需显式指定 2. **数据库上下文错误** ```sql -- 确认当前数据库 SELECT DB_NAME(); USE [CorrectDatabase]; -- 切换正确数据库 ``` --- ### **五、高级排查工具** 1. **执行计划分析** ```sql SET SHOWPLAN_TEXT ON; GO SELECT * FROM pinghengMark WHERE barcode = '0000004043'; GO SET SHOWPLAN_TEXT OFF; ``` - 检查是否使用了索引扫描/表扫描 2. **全表内容检查** ```sql -- 导出全表数据(慎用) SELECT TOP 1000 * FROM pinghengMark ORDER BY (SELECT NULL); -- 避免索引影响 ``` --- ### **典型解决方案流程** 1. 确认当前数据库上下文 2. 检查字段数据类型与排序规则 3. 使用`LIKE '%...%'`模糊匹配验证 4. 检查活动事务状态 5. 验证表架构权限 **注意**:若字段为唯一键,可尝试通过系统视图直接定位: ```sql SELECT t.name AS TableName, i.name AS IndexName FROM sys.indexes i JOIN sys.tables t ON i.object_id = t.object_id WHERE i.is_unique = 1 AND COL_NAME(ic.object_id, ic.column_id) = 'barcode'; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忱光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值