DBの利用状況をAccessから把握したい

このQ&Aのポイント
  • MS Access 2003のVBAからSQL Server 2005の利用状況を参照できるのか?
  • DB、テーブル、レコードへの接続台数や接続ユーザー名などの特定情報を知りたい
  • 特定のテーブルの使用やADPの起動状況により処理を制限したい
回答を見る
  • ベストアンサー

DBの利用状況をAccessから把握したい

MS Access 2003 のVBA からSQL Server 2005 の利用状況を参照できるのでしょうか? 知りたい情報は↓です。 DB、テーブル、レコードへの接続台数(もしくは接続の有無) 上記に接続しているユーザー名とかコンピュータ名、ホスト名など特定できる情報 <やりたい事> 更新テーブル(ワークテーブル)にデータを移してメンテナンスし、処理が完了したらストアドで 元のテーブルにデータを戻すのですが、その間元のテーブルのレコードにロックをかけたい。 (現在はワークテーブルに対して主キーでDcountで確認している) 誰かが特定のテーブルを使っている時は、締切処理が出来ないようにしたい。 誰かがADPを起動している時はバックアップ処理を出来ないようにしたい。

  • SEsyo
  • お礼率78% (64/82)

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

MDBでよく見かける「ローカルのワークテーブルにまとめて落してグリッドでメンテナンスさせる」というのの類似のことをやろうとしているのでしょうか?私はあまりそういうのはしないので、踏み込んだコメントは避けます(アプリケーションロックでしのいでいる例が多いかもしれないですね) ・元のテーブルにロックを掛けたいとのことですが、SQL Serverにロックヒントなどを使ってロックを掛けさせると、ロックされたリソースにアクセスした側は永遠に待ちになりますので、あとからアクセスした側は画面が真白になって使い物にならないと思います。で、SET LOCK_TIMEOUT 0とすればすぐにロックタイムアウトしますが、アプリケーションの修正を考えると現実的ではないでしょう。 メンテナンス中にロックを掛けたままトランザクションを維持し続ける仕組みも難しいです。 ・SQL Server 2005から動的管理ビューで、sys.dm_exec_sessionsというのが提供されていますので、「現在アクセスしているセッション」は見ることができます。見られるのはアクセスしているアプリーケーション名、ユーザ名、ホスト名などですが、テーブル単位・レコード単位でのアクセス状況がわかるわけではありません。 ・コントロールする単位がテーブルであったとしても、Oracleと違い、SQL Serverはテーブル単位で参照専用にすることはできません。更新を無効にするトリガを仕込んで、それをメンテナンス中だけ有効にするのがせいぜいかと思います。

SEsyo
質問者

お礼

いつも、ありがとうございます。 色々考えてみましたが、色々やりたいことがあるので当面現状のまま 様子を見てみます. (ワークテーブルに同じキーのデータがあれば、更新できない旨の メッセージを表示する)

関連するQ&A

  • アクセスadpでのDLookUp関数

    アクセス2003 adpのレポートのあるコントロールのコントロールソースにDLookUp関数を使おうとしています。 =DLookUp("列名","ストアドプロシージャー名") *ストアドプロシージャーの抽出条件にパラメータを設定してあります レポートの「入力パラメータ」にも記入してあります *ストアドプロシージャーを実行した結果のレコードは1つのみです mdbでは =DLookUp("列名","クエリー名") でうまくいっていたのですが adpの場合#エラーになってしまいます 一時ファイルにレコードを追加してそれを引数にすればうまくいくのですが、 できればストアドプロシージャーを引数にしたいと思っています。 どなたかご教授をお願いいたします

  • ワークテーブル(ローカル)からDBサーバーへの更新について

    Access2003+PostgreSQLにて販売管理システムを構築しています。 レコードを見る・更新する時はサーバーのレコードを ワークテーブル(ローカルのmdbファイル内のテーブル)にコピーし 値を変更後、ローカルからサーバーにデータを戻す、といった処理をしたいと考えています。 サーバーからレコードをコピーする際は、ODBC接続&ADOにて サーバーのレコードを一旦レコードセットに格納し 「CurrentProject.Connection.Execute SQL文」で ワークテーブルにINSERTしています。 ここで質問なのが、ワークテーブルからサーバーにレコードを戻す際は ワークテーブル・サーバーへはそれぞれどの方法で接続すればいいでしょうか。 例えばサーバーへODBC&ADOで接続した場合、ワークテーブルの取扱方法(接続方法)が分かりません。 サーバー:ADO、ワーク:DAO、みたいな事するのでしょうか。 スマートな方法がお分かりの方は教えて下さい。 宜しくお願い申し上げます。

  • Accessプロジェクト ストアドプロシージャでのデータ更新

    AccessのMDBをADPへ作り変えています。 MDBの更新クエリーの場合、「レコードの更新」欄に更新したい値を記述します。たとえば、ユーザー定義関数を使っている場合は、ユーザー関数名([○○○]) ・・・。 これと同じことを、ADPのストアドプロシージャで行う場合はどのようにすればよいのでしょうか? スツアドプロシージャは「デザイナを使用してストアドプロシージャを作成する」を使って作成しています。ここで、「新しい値」欄に ユーザー関数名(○○○) と記述すると、 ”ADOエラー:"ユーザー関数名"は関数名として認識されません” となります。 初めてADPを使用するのでよくわかりません。 以上、よろしくお願いします。

  • 削除時のトリガについて

    レコードの更新時にトリガで処理履歴を履歴テーブルにとりたいのですが、 元のレコードに処理端末「Environ("COMPUTERNAME")」で取得している)と言う 項目があるので、登録時と訂正時は inserted を使うので処理履歴に どのPCで処理したか記録が残るのですが、削除時は deleted を使うと 削除されたデータの記録になるので、削除の前に処理したPCになってしまいます。 実際に削除したPC名にしたいので・・・ 現在は削除時のトリガを無効にして、元のレコードを削除するストアドに 処理端末を渡してそのストアドで履歴に追加しているのですが、 トリガ(もしくはSQL側)で呼び出したPC名は把握できないものでしょうか?

  • Access DCOUNTの意味

    Access DCOUNTの意味 http://okwave.jp/qa/q3078359.html テーブルで重複があったものを除外したデータが欲しいと思い検索した結果上記のURLがヒットしました。 ページには、 Sum(1/DCount("*","TABLE1","ID='" & [ID] & "'")) という関数がありますが、ここの意味がわかりません。Dcountの意味は理解しました。 ただ、Sum(1/DCOUNT の意味がわかりません。 サイトに解説がかいてあるのですが・・・私には理解できません。 例えば、[ID]には001と002のIDコードがあるとします。 001には3レコード、002には2レコードあるとします。 DCOUNTで3という結果と2という結果を得られると思います。 よって、SUM(1/3 + 1/2) というように読み取れてしまいました。 上記だと2という値が取得したいのですが、私はどこを勘違いしているのでしょうか?

  • access ダブリ登録を防止したい

     ダブリ入力を防止したいのです。一作業で大量に入力するので、ダブリ入力をしたらその場でダブったことを知らせる警告文を表示させたいと思っています。  入力はフォームのデータシートビューのコントロール(テキストボックス)に入力させてます。このフォームのレコードソースはテーブルです。  コントロール(テキストボックス)の更新後処理としてやっているのですが、うまくいきません。  重複クエリ・ウィザードでレコードソースであるテーブルそのものを参照して、Dcountで2以上を返したら警告文を表示、としましたが、うまくいきません。クエリ結果とDcountの数がなぜか一致しません。  いま行き詰まってます。よろしくご教授ねがいます。

  • Access2003 VBAのDELETEについて

    AccessでOracleとODBC接続してデータを操作するアプリを作成しています。 処理をする際に毎回ワークテーブルを全件削除し、取り込んで本テーブルにインサートする という処理にて、ワークテーブルのデリート文でなぜか10件しかレコードが削除されません。 固有レコードの問題を解消するためにDB側ではID列をPKとして一意に決まるように振っています。 ODBCのリンクテーブルという形で登録しています。 テーブル:TEST_WORK カラム:ID(PK)、コード、名称 CurrentDb.Execute "DELETE FROM TEST_WORK" 上記記述にてなぜか全削除されません。 感じとしては一回目のdeleteでIDが1~9までが削除され、次にdeleteした際は10~99までが削除され・・・というように桁数で変化している気がします。 全て消すにはどのようにすればよいでしょうか?

  • フィルタ後のフォームの件数の取得の仕方

    あくせすです。 テーブルを元にフォームにデータを表示させているのですが 元データのテーブルのレコード数が100件だとして 今フォーム上で手作業でフィルタをかけて表示しているレコード数が20件だとしたら、 この20件と言う数をVBAで取得する方法を教えてください。 DCountだと、元テーブルの全てのレコード数(フィルタ前)が取得されてしまいます。

  • ACCESSでcsv テーブルを利用する良い方法は?

    いつもお世話になっています。ACCESS はまったくの素人です。 csv で提供される6種類程度の元データがあり、定期的にファイル単位で更新されます。これを現在はテーブルにリンクしているのですが、処理が重くて困っています。インポートすると劇的に軽くなりますが、元ファイルの更新時に手間が増えて困ります。具体的には再度インポートしてテーブルを上書きするとリレーションシップが切れてしまうので、一度全てのレコードを削除して、新たに全レコードを追加すると言う手順を思い描いています。 このような場合、どうするのが効率的なのでしょうか。よろしくお願いいたします。

  • プログラムの考え方とDBの扱いかたについて

    技術的な質問ではなく、考え方についての質問です。 こっちを立てるとあっちが立たずのような状態で困ってます。 どのカテゴリで質問するか悩んだのですが、直近の投稿数が多いのでC言語のところで質問させて頂きます。 ご教示ください。 現在こういうバッチプログラムがあります。 バッチA  > (1)外部から前日分の確定データリストを取得  > (2)データリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDB(テーブルA)に格納 ※1つのプログラムで3つの処理を行ってます 今度、データリストの取得先に外部2が追加されます。 仕様が同じであれば、バッチAと同様のものを作ればいいのですが、 外部2の場合、1か月の間データが確定されないという仕様があります。 前日分のデータが確定するのは、 1カ月後までの間に取得するデータリストにキャンセルデータが無かった場合です。 1.そこでこのように考えました。 バッチA  > 外部2から1カ月分のデータリストを取得  > 取得データから、1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する  > (2)データリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDBに格納 2.でも、毎日1か月分のデータを取得して抽出処理を行うのは負担になるし、 毎日ほぼ同じデータを取得するのはあほらしいと思い、以下のように考えました。 バッチA  > 外部2から前日分のデータリストをDB(テーブルB)に格納  > DBから1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する  > (2)データリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDB(テーブルA)に格納 3.今度はそもそもバッチ分けた方がいいんじゃないかと思い、以下のように考えました。 バッチ1  > 外部2から前日分のデータリストをDB(テーブルB)に格納 バッチA  > DBから1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する  > (2)抽出したデータリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDB(テーブルA)に格納 4.さらに、キャンセルデータの処理も別バッチにすれば、   バッチAでの処理がわかりやすくなるじゃないかと思い、以下のように考えました。 バッチ1  > 外部2から前日分のデータリストをDB(テーブルB)に格納 バッチ2  > DB(テーブルB)から1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する  > 抽出したデータのキャンセルデータのレコードをDB(テーブルB)から削除 バッチA  > (1)DB(テーブルB)から前日分のデータリストを取得  > (2)データリストに基づいて特定処理の実施  > (3)特定処理の対象になったものをDB(テーブルA)に格納 ここまで考えてどうするのがスマートなのかよくわからなくなってきてしまいました。 3か4でいこうと思うのですが、3の時にバッチAで抽出処理をするのはいまいちって思ってます。 それで4にしようと思ったのですが、 テーブルBは取得データをそのままの状態で入れておくって当初考えてたので、 それをあとからレコード削除したりするのもどうなんだろうと思ってます。 確定したデータと未確定のデータが混在するのもなんだか腑に落ちません。 それだったら、新たにテーブルCを作って、確定データを突っ込んでおくってことも考えたのですが、 そうなると、バッチA最後に格納しているテーブルAと何も変わらないようなものがもう一つできてしまいます。 どういうのがスマートというか良い考え方なのでしょうか。