0

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

select * from contacts

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

select * from user1000.contacts

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

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

4

2 回答 2

2

试试手册中的这个建议:

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

于 2013-07-22T13:49:42.930 回答
1

如果您确定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- 由于各种原因,* 和缺少的模式前缀都可能有问题。

于 2013-07-22T13:50:09.153 回答