SSブログ

ACCESS 排他制御について考える・その2 [ACCESS]

 この記事も試行錯誤して失敗した、その経緯を記述した物なので、参考になりません。
 切にACCESSでの排他の方法をお探しの方は、他を当たってください。

 さて、いろいろ排他について調べていて、もう一つ排他に使えそうな物を見つけました。
 ACCESSの接続文字列の中に、
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=・・・;Mode=Share Deny Read|Share Deny Write;・・・
 という部分があります。
 このShare Denyは、排他に関する記述というのは知っていたので、改めて内容を調べてみました。

 MSDNで検索をかけたら、ちょっと違うけど、それっぽい記述を見つけました。

READ
データベースの読み取り専用のコピーを開くことができます。

WRITE
データベースの書き込み専用のコピーを開くことができます。

READWRITE
複数のプロセスで、データベースを開いたり、変更できます。

SHARE DENY READ
他のプロセスは読み取りモードで開けません。

SHARE DENY WRITE
他のプロセスは書き込みモードで開けません。

SHARE EXCLUSIVE( SHARE DENY READ | SHARE DENY WRITE )
他のプロセスは読み取り/書き込みモードで開けません。

SHARE DENY NONE
他のプロセスからの読み取りまたは書き込みを拒否できません。

 これを踏まえて、ちょっと実験です。

Dim CnA As New ADODB.Connection
Dim CnB As New ADODB.Connection

CnA.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;DATA SOURCE=D:\TEST.accdb;Mode=Share Deny Write;"

CnB.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;DATA SOURCE=D:\TEST.accdb;Mode=ReadWrite;"


 を実行してみます。
 CnBのOpenで、下図のエラーが起きました。

 分かり易いパターンですが、他からのアクセスを拒否する事ができました。

 しかし、実際のプログラムは、このパターンでは作れません。
 「自分は読み書きして、他からは書き込みできない」というモードが欲しいのですが、どう書いて良いのかわかりません。
 「Readwrite | Share Deny Write」かなぁと思いつつ、これはエラーになってしまいます。

 そこで、「Mode=Share Deny Write」の右辺は、英語の綴りになっていますが、実際のパラメタは数値であって、対応する数字で設定しても大丈夫なんじゃないかと予測しました。
 で、「Mode=1」「Mode=2」と数字を順に設定してOpenしてみました。Openしたあと、Connectionを参照して、どんな接続文字列になっているかを確認してみました。

 結果は以下の通り。
1・Mode=Read
2・Mode=Share Deny None
3・Mode=ReadWrite
4・Mode=Share Deny None
5・Mode=Share Deny None
6・Mode=Share Deny None
7・Mode=Share Deny None
8・Mode=Share Deny Write
9・Mode=Share Deny None
10・Mode=Share Deny None
11・Mode=Share Deny None
12・Mode=Share Deny Read|Share Deny Write
13・Mode=Read|Share Deny Read|Share Deny Write
14・Mode=Share Deny None
15・Mode=Share Deny None
16・Mode=Share Deny None
17・Mode=Share Deny None
18・Mode=Share Deny None
19・Mode=ReadWrite|Share Deny None


 これ以外の値は、エラーになりました。
 2進数で見てみたりしましたが、法則性はわかりませんでした。

 「Readwrite | Share Deny Write」という設定は、存在しないようです。

 結論。
 自分だけ読み書きできて、他の人は書き込めない(読み込みのみ)という状態は作れない。
 と言うことみたいです。この方法では。

 あ、これはデータベースがACCESSの場合です。OracleやSQLServerは他の方法があります。


nice!(1)  コメント(0)  トラックバック(0) 

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
※URL(リンク)は記述できません。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。