我在服务器故障后恢复了数据库,现在我遇到了表名显示为database_user_name.table_name
. 所以当我查询类似:
select * from contacts
它不起作用,因为它希望它是完全合格的,如:
select * from user1000.contacts
这样做的问题是我有数百个存储过程用它们的名称引用表,所以没有一个查询起作用。
有没有办法告诉 SQL Server 2005 从表中删除用户名而不将用户更改为所有者?
我在服务器故障后恢复了数据库,现在我遇到了表名显示为database_user_name.table_name
. 所以当我查询类似:
select * from contacts
它不起作用,因为它希望它是完全合格的,如:
select * from user1000.contacts
这样做的问题是我有数百个存储过程用它们的名称引用表,所以没有一个查询起作用。
有没有办法告诉 SQL Server 2005 从表中删除用户名而不将用户更改为所有者?
试试手册中的这个建议:
若要使用 SQL Server Management Studio 更改表或视图的架构,请在对象资源管理器中,右键单击表或视图,然后单击“设计”。按 F4 打开“属性”窗口。在“架构”框中,选择一个新架构。
如果您确定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
- 由于各种原因,* 和缺少的模式前缀都可能有问题。