【问题标题】:Remove user name from table name从表名中删除用户名
【发布时间】:2013-07-22 13:40:40
【问题描述】:

我在服务器故障后恢复了一个数据库,现在我遇到了表名显示为database_user_name.table_name 的问题。所以当我查询类似:

select * from contacts

它不起作用,因为它希望它是完全合格的,如:

select * from user1000.contacts

这样做的问题是我有数百个存储过程,它们用它们的名称引用表,所以没有一个查询起作用。

有没有办法告诉 SQL Server 2005 从表中删除用户名而不将用户更改为所有者?

【问题讨论】:

    标签: sql-server sql-server-2005 database-schema


    【解决方案1】:

    试试manual的这个建议:

    要使用 SQL Server Management Studio 更改表或视图的架构,请在对象资源管理器中右键单击表或视图,然后单击设计。按 F4 打开“属性”窗口。在“架构”框中,选择一个新架构。

    【讨论】:

    • 如果有 100 个表,效率不会很高。
    【解决方案2】:

    如果您确定dbo 架构中也不存在任何表,那么您可以说:

    ALTER SCHEMA dbo TRANSFER user1000.contacts;
    

    要为该架构中的所有表生成一组脚本,您可以说:

    DECLARE @sql NVARCHAR(MAX);
    
    SET @sql = N'';
    
    SELECT @sql = @sql + N'
      ALTER SCHEMA dbo TRANSFER user1000.' + QUOTENAME(name) + ';'
      FROM sys.tables
      WHERE SCHEMA_NAME([schema_id]) = N'user1000';
    
    PRINT @sql;
    --EXEC sp_executesql @sql;
    

    (一旦您对 PRINT 输出感到满意 - 承认即使变量确实包含整个脚本,它也会在 8K 处被截断 - 取消注释 EXEC 并再次运行它。这不会检查潜在的冲突。)

    但真正的解决方法是修复您的代码。您永远不应该说 select * from contacts - * 和 the missing schema prefix 都可能由于各种原因出现问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2021-11-30
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多