什么会导致新恢复的 SQL 数据库显示表,但在尝试查看表数据时显示“无效对象”错误?

Aar*_*ron 5 schema sql-server-2008-r2 logins

问题:

作为一名未经培训且非自愿的 SQL DBA,我正在使用一组 SQL 2008R2 数据库并在另一个环境中恢复到新的 SQL 2008R2 服务器。

恢复过程顺利,没有错误。当我尝试使用我们的数据库资源管理器连接到它们时,我看到数据库和表正确填充。不幸的是,当我尝试查看表的数据时,它给了我一个“无效对象”错误。

背景:

当我们过去为其他客户端执行这些操作时,我们通常会运行此脚本来“修复孤立用户”。这通常是我们运行的全部内容,然后数据库与我们的 db explorer 和软件一起工作。如果我们在 SQL 版本之间切换,我们还将使用单独的脚本更改数据库的兼容模式

use dbar;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbarforms;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbdoc;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbhistory;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbhl7;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbmds;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbparadox;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbpicklist;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbreport; 
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
use dbrx;
EXEC sp_change_users_login 'update_one', 'nurse', 'nurse';
Run Code Online (Sandbox Code Playgroud)

故障排除步骤:

我注意到我们在 MSSQL 上运行的测试服务器都将护士登录显示为拥有 10 个数据库的所有权。在用户列中显示“nurse”,在默认模式列中显示“dbo”

在我遇到问题的这台服务器的情况下,它显示护士登录拥有 10 个数据库的所有权,用户列和默认架构列都说“护士”。

所以我的第一个猜测是另一个环境被设置为使用一个名为“nurse”的模式,而新服务器没有它。我试图在其中一个数据库中创建一个名为“nurse”的新模式,但出现此错误:

在此处输入图片说明

然后我在几张桌子上尝试了这个,看看它是否有效......没有这样的运气

ALTER SCHEMA dbo TRANSFER nurse.Table1 <--- This actually did fix my issue. I had it backwards before.
Run Code Online (Sandbox Code Playgroud)

我的主要问题是我什至不知道根本问题是什么,只是它不起作用。我已经与我们的开发人员和其他有一些 SQL 经验的人交谈过,他们都被难住了。

任何支持将不胜感激。提前致谢!

~AA-罗恩

Ken*_*her 5

听起来对象仍然存在,但归架构所有nurse。所以例如,而不是dbo.Table1它会是nurse.Table1.

您的用户看不到这些表,因为他们不包括名称的架构部分。如果不包括架构

SELECT * FROM Table1
Run Code Online (Sandbox Code Playgroud)

然后schema使用的是来自数据库主体(用户)的默认架构。在这种情况下,正如你所说,dbo这是常态。检查这一点的简单方法是执行以下操作:

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'yourtablename'
Run Code Online (Sandbox Code Playgroud)

如果TABLE_SCHEMA值是nurse那么那是你的问题。尝试像这样更改您的主体的 default_schema:

alter user [username] with default_schema = [nurse];
Run Code Online (Sandbox Code Playgroud)

您也可以通过包含两部分名称来查询表:

SELECT * FROM nurse.Table1
Run Code Online (Sandbox Code Playgroud)