SQL Server表名以用户数据库中的#开头,而不是tempdb(不是临时表)


13

几十年前,以某种方式在我们的数据库中创建了一个以#。开头的表。它显示在应用程序数据库下的对象资源管理器中,而不是中tempdb。由于某些原因,Azure不会像这样导入数据库。

我们无法删除它,对其重命名或与之交互。我试过从对象资源管理器中删除,从GUI中删除脚本重命名,但它们都没有起作用。

我们正在使用SQL 2008 R2。

drop table [*app*].[dbo]."#OBSOLETE";

Database name '*app*' ignored, referencing object in tempdb.
Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#OBSOLETE', because it does not exist or you do not 
have permission.

exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete"

Msg 15225, Level 11, State 1, Procedure sp_rename, Line 338
No item by the name of 'dbo.#OBSOLETE' could be found in the current database '*app*', given that @itemtype was input as '(null)'.

我们如何杀死该对象,以便将其迁移到Azure?


4
尝试在表格名称两边加上括号,是否有相同的反应?
rvsc48

1
如果@ rvsc48的解决方案不起作用,可以尝试使用QUOTENAME函数吗(尽管我认为可以)。 docs.microsoft.com/en-us/sql/t-sql/functions/…–
MguerraTorres

1
方括号:同样的反应。
那家伙

1
请在包含该表的数据库中运行以下查询,并将输出粘贴到问题中:SELECT [name], CONVERT(VARBINARY(128), [name]) FROM sys.tables WHERE [name] = N'#OBSOLETE';。谢谢。
所罗门·鲁兹基

2
另一个选择(我没有时间测试):1)获取该object_id表的。2)以单用户模式重新启动实例。3)通过专用管理员连接进行连接。4)在该数据库中,尝试类似的操作UPDATE sys.objects$ SET [name] =N'obsolete' WHERE [object_id] = {ye_olde_object_id}; {enter} GO {enter}。值得一试..
所罗门Rutzky

Answers:


16

鉴于:

  1. sp_rename 使用对象名称而不是对象ID,
  2. 我们无法使用对象名称,因为它以a开头,#并且被解释为具有特殊含义并且以不同的方式处理,
  3. 所有其他选项已用尽

您应该尝试直接通过专用管理控制台(DAC)连接来编辑基础系统目录表:

  1. 获取该object_id表的。
  2. 在单用户模式下重新启动实例。这是为了能够直接更新系统表(即不要求使用DAC连接)。
  3. 通过专用管理控制台连接进行连接。您可以在SQLCMD交互式会话中执行此操作,方法是在“命令提示符”窗口中运行以下命令:

    C:\> SQLCMD -A -E

    或者,直接使用以下方法连接到数据库:

    C:\> SQLCMD -A -E -d {database_name}
  4. 在该数据库中,尝试以下操作:

    UPDATE sys.objects$ {enter}
    SET [name] = N'obsolete' {enter}
    WHERE [object_id] = {ye_olde_object_id}; {enter}
    GO {enter}

    在您输入之前,它不会执行该语句GO {enter}

直接编辑系统目录表时请小心,不要对这样做的想法感到过分满意。这是一件应该做的唯一的,如果有绝对固定的问题(如这里的情况),没有其他办法。避免直接编辑可能有几个原因,但是最初想到的两个原因是:

  • 就像我们创建的数据模型一样,可能存在一些规则和工作流,这些规则和工作流使我们不了解事情的运行方式(例如,非规范化,控制各个表中数据状态的“业务”规则等)
  • 如果您遇到问题并签订了支持合同,则直接进行编辑很可能会使Microsoft失去为您提供帮助的责任(我没有看到支持协议的条款,但是我很难相信这种语言不会那里)

    @Paul Randal在对我的一个相关答案的评论中证实:“手动编辑系统表不可撤销地在数据库的引导页面中设置了一个标志,用于将您的数据库标记为已通过这种方式进行了编辑,而CSS可能会决定不起作用如果您随后对该数据库有问题,则表示您。”


4
我喜欢这个答案,但也许值得为此加一句话,为什么这样做如此危险?
Joe Obbish

@JoeObbish谢谢,很好的建议。明天我会尝试添加一些东西。
所罗门·鲁兹基

2
@JoeObbish我刚刚添加了一些内容。够了吗?
所罗门·鲁兹基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.