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はnullです(データベースコレクションを反復処理すると、予想どおり、マスターとtempdbのみが表示されます-オブジェクトエクスプローラーで表示できるdbです)。これは明らかにセキュリティに関係しています。オブジェクト エクスプローラーでテーブルが表示されない場合、SMO を介してテーブルにアクセスすることはできません。スクリプトを生成できるようにするための回避策または代替方法のアイデアはありますか?

どうも!

4

2 に答える 2

0

SMO コードは見ていませんが、データベース オブジェクトでコンストラクターを使用してみましたか? 直接アクセスできる場合もあります。

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

myDb.Tables コレクションは空ですか? 間違った名前を使用して参照している可能性がありますか?

試すことができる 1 つのオプションは、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 に答える