Microsoft Access 掲示板

dbReadOnlyでテーブルを読み取り専用にできる???

8 コメント
views
4 フォロー

DAOのOpenRecordset dbReadOnlyでテーブルを読み取り専用にできるでしょうか?

OptionsとLockEditに入れられるようですが、
読み取り専用になるのが解説によって「自分だけ」「他人だけ」「全員」で分かれています。
私がいじったところOptionsに入れて自分だけ読み取り専用、
LockEditに入れてエラー「引数が無効」ですが、
もう何だか分からなくなってしまいました。

詳しい方から教えていただけると大助かりです。よろしくお願いします。

banjo
作成: 2023/12/01 (金) 11:56:03
通報 ...
1

DAOのOpenRecordset dbReadOnlyでテーブルを読み取り専用にできるでしょうか?

OptionsとLockEditに入れられるようですが、

dbReadOnly はOptionsだけだと思いますが。(下記参照)

Options引数
RecordsetOptionEnum 列挙 (DAO) | Microsoft Learn

LockEdit引数
LockTypeEnum 列挙 (DAO) | Microsoft Learn

読み取り専用になるのが解説によって「自分だけ」「他人だけ」「全員」で分かれています。

上記のMSの公式のリンク先の解説では、

dbReadOnly Recordset を読み取り専用として開きます。

となってます。開いたRecordsetが読み取り専用になるということだと読み取れます。他のユーザーが更新できないとは書かれてません。

他のユーザーがレコードを変更できないようにするなら、下記ではないでしょうか。

dbDenyWrite 他のユーザーが Recordset のレコードを変更できないようにします。

私は下記のように理解しています。もし、試した結果が異なる場合は指摘してください。

'このレコードセットのみ読み取り専用。他ユーザーは更新可能。
Set rs = CurrentDb.OpenRecordset("テーブル名", dbOpenTable, dbReadOnly)

'このレコードセットは更新可能。他ユーザーは更新不可。
Set rs = CurrentDb.OpenRecordset("テーブル名", dbOpenTable, dbDenyWrite)

'このレコードセットも他ユーザーも更新不可。
Set rs = CurrentDb.OpenRecordset("テーブル名" ,dbOpenTable ,dbReadOnly + dbDenyWrite)
2

気になって検索してみたら、間違った(?)解説してあるサイトが結構ありますね。
このような場合はまずはMSの公式を参照して確認するのがいいです。
ただ、公式もたまに間違っているときがありますので、実際にテストして確認するということも必要になります。

3
banjo 2023/12/01 (金) 16:07:28 a7fa5@fcedf

>>hatena様、情報を整理して紹介して下さってありがとうございます。
hatenaさんがおっしゃれば心強いです! 私もやっと安心です。

ただ、公式もたまに間違っているときがありますので、実際にテストして確認するということも必要になります。

それが、まさに Database.OpenRecordset メソッド (DAO) のページにあるようで……
https://learn.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/database-openrecordset-method-dao

注: dbReadOnly を Options 引数または LockedEdit 引数のどちらか一方で使用することはできますが、両方では使用できません。 両方の引数で使用すると、実行時エラーが発生します。

ただ、検索していると昔は入れられた節があり???、修正漏れなのかもしれません。
「間違った(?)解説」は、海外の出版物でもちょくちょく出会い、本当に戸惑いました。

ともあれ本当にありがとうございました!

5

あら、読み落としてました。
ちょっと意味不明な注意書きですね。

4
banjo 2023/12/01 (金) 16:14:17 a7fa5@fcedf

ちなみにこんなことをする必要はありませんが、間違えてたまたま dbReadOnly + dbFailOnError にしたところ、自分は更新できる・他のユーザは更新できないという振る舞いもしました。このへんも完全に謎ですが、正統と思われる hatena さんの書いて下さった感じで使いたいと思います。

6

いえ、全然、正統ではないです。
WEB上の情報と、自分の少ない経験のみですので。

結局、最終的には自分で試してみるしかないですね。

8

hatena さんに責任を負わせたいのではないのでご安心を(笑)。
私もいろいろ試した上で、そのようにしたいと自己責任で判断しました。

7
banjo 2023/12/01 (金) 17:15:36 7774f@e72db

ちょっと考えが進んだので、書き残させて下さい。
試した感じだと、この両方が自分更新可・他者更新不可で動くようです。

Set rs = db.OpenRecordset("table1", dbOpenTable, dbReadOnly + dbFailOnError)
Set rs = db.OpenRecordset("table1", dbOpenTable, dbFailOnError, dbReadOnly)

判断できるのは、
Access のほうで、「ロールバックを想定してるんならおまえが操作するんだよな?」ということで
切り替えてくれるらしいこと。
一応 LockEditにdbReadOnlyが受け付けられるパターンがあること……です。
ただし、(飽くまでも私の環境では)何か動作が不安定な感じがあるので、
MS の公式外、保証外、裏技、昔はできたけど既に見捨てられた何かなのかもしれません。

このへんのせいで、日本語でも英語でも解説が散らばったのかもしれません。
「かもしれない」が続きましたが、改めて言って、
hatenaさんが書いて下さったところが本道なのだと思います。
私もそちらに従わせていただきます。