我以非 sa 用户“bhk”身份登录到 SQL Server 2005 数据库,该用户仅是“公共(public)”服务器角色的成员。以下代码尝试在用户“bhk”调用的存储过程中执行。这行代码...
TRUNCATE TABLE #Table1
DBCC CHECKIDENT('#Table1', RESEED, @SequenceNumber) WITH NO_INFOMSGS
导致此错误...
User 'guest' does not have permission to run DBCC CHECKIDENT for object
'#Table1__00000000007F'.
我知道运行 DBCC CHECKIDENT 所需的权限...
调用者必须拥有表 ,或者是 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。
所以我有两个问题:
创建临时的过程
表,不应该是“bhk”的所有者
并被允许运行 DBCC
检查员?
消息返回该用户'guest'
没有权限?据我所知,我不是
以“访客”身份登录。
任何帮助将不胜感激。
最佳答案
你写了:
"Caller must own the table, or be a member of the sysadmin fixed server role, the db_owner fixed."
所以(如果它不是一个错误),根据 Lieutenant Columbo's无可挑剔的逻辑,每个前提都必须是错误的。这意味着,调用者不拥有该表,即使他创造了它。
事实上,似乎所有在 tempd 中创建的对象由 dbo 所有默认情况下。如果您在查询分析器中执行以下操作,您可以检查它:
CREATE TABLE #NotMyTable (TestID int identity)
SELECT user_name(uid) FROM sysobjects WHERE name LIKE '#NotMyTable%'
您会看到 dbo 是临时表的所有者。
那么,有什么办法可以解决呢?
(前言:我不喜欢那种操纵,但智力刺激正在驱使我……;-))
因此,您可以编写另一个存储过程,将 tempdb 的 sysobjects 中的 UID 更新为用户的值(颤抖!)。我只在查询分析器中对其进行了测试。更新后我可以执行您的 DBCC CHECKIDENT 命令。
关于sql-server-2005 - 临时表上的 DBCC CHECKIDENT 为错误的用户抛出权限错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/187920/