sql-server-2005 - 临时表上的 DBCC CHECKIDENT 为错误的用户抛出权限错误

标签 sql-server-2005 stored-procedures permissions temp-tables

我以非 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'正在调用存储
    创建临时的过程
    表,不应该是“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)
  • 连接到同一 SQL Server 的 tempdb 作为 dbo
  • 执行: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/

    相关文章:

    oracle - 在过程中创建 oracle sql 游标错误

    php - 当我使用输出参数调用存储过程时,mysql 中出现错误代码 1414

    python - 如何为特定模型实例设置添加、删除、更新和查看权限?

    SQL递归查询

    sql-server-2005 - SQL Server 中的 varchar 比较

    sql - 获取每组的前 1 行

    sql - 如何删除插入表中标识列的重复值?

    sql - 同一查询在进程外运行速度更快

    django - Django 中的动态用户菜单

    linux -/usr/include/zconf.h 属性变成了 ----------