0

我有一个客户在托管服务器上有一个 SQL 数据库;调用数据库“myDatabase”。

托管公司 已锁定对象资源管理器 - 我在列出的数据库中看不到 myDatabase(我看到 tempdb 和 master)。但是,如果我“使用 myDatabase”然后“从 myTable 中选择 *”,一切正常。

由于我们无法访问对象资源管理器,因此我无法右键单击并生成脚本。我以为我可以使用 SMO 来完成我想要的,但是当我尝试类似的事情时:

Server myServer = new Server(conn);
Database myDB = server.Databases["myDatabase"];
Table myTbl = myDB.Tables["myTable"];

它失败了 - myDB 为空(当我遍历数据库集合时,正如预期的那样,我只看到 master 和 tempdb - 我可以在对象资源管理器中看到的 db)。这显然与安全有关——如果我在对象资源管理器中看不到表,它不会让我通过 SMO 访问它。任何人都对允许我生成脚本的解决方法或替代方法有任何想法?

谢谢!

4

2 回答 2

0

我还没有查看 SMO 代码,但是您是否尝试过在数据库对象上使用构造函数?也许您可以直接访问它。

Database myDB = new Database(myServer, "myDatabase");
于 2009-01-12T20:17:03.547 回答
0

myDb.Tables 集合是空的吗?可能是您使用错误的名称引用它吗?

您可以尝试的一种选择是使用 Linq2Sql 生成数据库模型。然后,您可以使用该模型创建一个与原始数据库大致相同的新数据库。查找 DataContext.CreateDatabase 方法以获取更多信息。

另一种选择是使用以下查询列出所有表:

select * from sys.tables

然后使用以下命令列出表中的所有列:

select * from sys.columns where object_id = (object id from the previous query)

这将为您提供数据库中定义的所有表和列,并且应该足以创建数据库结构。此外,您还定义了其他对象的系统视图。

于 2009-01-12T20:42:51.857 回答