我在服务器故障后恢复了数据库,现在我遇到了一个问题,表名显示为database_user_name.table_name
。所以当我查询类似的东西时:
select * from contacts
它不起作用,因为它期望它是完全合格的,如:
select * from user1000.contacts
这个问题是我有数百个存储过程用它们的名称引用表,因此没有任何查询可以工作。
有没有办法告诉SQL Server 2005从表中删除用户名而不将用户更改为所有者?
答案 0 :(得分:2)
尝试manual:
的建议要使用SQL Server Management Studio更改表或视图的架构,请在对象资源管理器中右键单击该表或视图,然后单击“设计”。按F4打开“属性”窗口。在“架构”框中,选择一个新架构。
答案 1 :(得分: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
- 由于各种原因,*和the missing schema prefix都可能有问题。