2013/09/13の60のおじんさんの質問と同じく
私も困っておりました。
DECOさんのとおり、
下記SQLを実行したところ、エラーがでました。
/* 現在接続しているクライアントのユーザ名を取得する */
SELECT rdb$get_context('SYSTEM', 'CURRENT_USER') FROM rdb$database;
Function Unknown
どうしたらよいのでしょうか??
9/18でした。
スミマセン rdb$get_contex() は Firebird 2.0 以降でした。
それ以前の Firebird から一貫してユーザ情報を取得するとなると、
SELECT CURRENT_USER FROM rdb$database;
なのですが、よく考えてみたら CURRENT_USER では現在のユーザしか取れませんね。
...そうなると TIBSecurityService を使ってユーザリストを取得するしかないと思います。
[TIBSecurityService.DisplayUsers (DocWiki)]
http://docwiki.embarcadero.com/Libraries/ja/IBServices.TIBSecurityService.DisplayUsers
便乗ですいません。
教えてもらって、あれからいろいろやったんですけど、同じようにエラーが出ていました。原因がわかってよかったです。
DEKOさん、誠にすいませんがInterBaseを使用しないで、できる方法はないんですよね???。
そうなると TIBSecurityService を使ってユーザリストを取得するしかないと思います。・・・と書いてますので。
> InterBaseを使用しないで、できる方法はないんですよね???
Interbase は使っていません。使っているのは IBX です。
(当然 Interbase を別途インストールする必要もありません)
Interbase も Firebird も元は同じなので
IBX を使えば Firebird でも同じ事ができます。
"Firebird の SQL のみを使って" という事であれば、
Firebird 2.0 またはそれ以前では無理なような気がします。
"Firebird かつ IBX を使わないで" となると
...例えば FireDAC の TFDIBSecurity (TADIBSecurity) を使うか、
GDS32.DLL (fbclient.dll) を LoadLibrary() して
直接クライアントの機能を使うしかないでしょうね。
(結局は同じ事をやっているのですけれど...)
・BDE では無理です。
・dbGo (ADO Express) では無理です。
・DBX では無理です。
・ODBC はもちろん無理です。
# Firebird の接続には何をお使いなのでしょう?
# Delphi のバージョンは?
[何度も出てくるので Firebird の接続方法 (Delphi Forum)]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1255
[FireDAC.Phys.IBBase.TFDIBSecurity (DocWiki)]
http://docwiki.embarcadero.com/Libraries/XE5/ja/FireDAC.Phys.IBBase.TFDIBSecurity
DEKOさんありがとうございます。
IBSecurityServiceを使用してやってみましたが、
DisplayUsersでエラーがでます。
RDB$USRSがないというSQLエラーでした。
ちなみに、Firebird2.1でも同様のエラーがでました。
Delphiは6と2010です。
接続はSQLConnectionをしようしてます。
> IBSecurityServiceを使用してやってみましたが、
> DisplayUsersでエラーがでます。
> RDB$USRSがないというSQLエラーでした。
RDB$USERS のエラーが出るという事は UserDatabase を指定されているのだと思います。
これを指定すると RDB$USERS というシステムテーブルを読みに行きますが、
RDB$USERS は Interbase 7.5 で追加された Interbase 固有のテーブルであるので、
Firebird では使えません (MON$ATTACHMENTS が Firebird 固有なのと同じです)。
DEKOさん、ありがとうございます!
確かにUserDatabase指定しておりました。
削除したら、User取得できました。
IBSecurityServiceは初めて使用するので、
わからないのですが、
すみません、これから自分なりに調べてみますが。
登録ユーザー全部取得して、
そのうちのどのユーザーがアクセス中なのかって
取得できるのでしょうか??
...ここまで書いて思ったのですが、60のおじんさんもぼくどらえもんさんも
"Firebird サーバに接続しているユーザの一覧" ではなく
"Firebird データベースに接続しているユーザの一覧" を取得したいのですかね?
だとすると、Firebird 2.1 またはそれ降が必要になる思います。
"Firebird サーバに接続しているユーザ一覧" であれば
IBSecurityService を使えばすべてのバージョンの Firebird で取得可能です。
(UserDatabase を指定しなければサーバに接続しているユーザが取れます)
> 登録ユーザー全部取得して、
> そのうちのどのユーザーがアクセス中なのかって
> 取得できるのでしょうか??
TIBSecurityService.ActiveUser := True;
あるいは、
TIBSecurityService.UserInfo[].ActiveUser を調べればいいかと。
すいません。60のおじんです。
私は、"Firebird データベースに接続しているユーザの一覧" を取得したい
のです。今現在、サーバーマシンにあるXXX.FDBにアクセスしているユーザー名の一覧です。
なお、以前書きましたが、Delphi6でFirebird1.5です。
> 私は、"Firebird データベースに接続しているユーザの一覧" を取得したい
> のです。今現在、サーバーマシンにあるXXX.FDBにアクセスしているユーザー名の一覧です。
であれば、
・サーバは Firebird 2.1 またはそれ以降
・Firebird 2.1 で作った、あるいは 2.1 でリストアした DB
が必要になると思います。この DB に対して
SELECT * FROM MON$ATTACHMENTS してやれば詳細情報が取れます。
(接続しているアプリケーション名すら取れます)
この場合には SQL を投げるだけですから、
BDE / IBX / DBX / dbGo / FireDAC / ODBC etc...
どれでも可能です。
[Trigger (FirebirdSQL)]
http://www.firebirdsql.org/refdocs/langrefupd21-ddl-trigger.html
トリガの構文に CONNECT / DISCONNECT があるので、
テーブルを自前で一つ作ってそこで管理できるような気がしますが、
CONNECT / DISCONNECT を使ったトリガも 2.1 以降なのでこれまた使えません。
60おじんです。DEKOさんいろいろありがとうございます。
とすると、今サーバーでは、Firebird 1.5で動いているので、上記は無理だと解釈してよろしいのでしょうか。
何度も、恐縮です。
> 上記は無理だと解釈してよろしいのでしょうか。
私は無理だと思っているのですが、
気になるようでしたら以下でお尋ねになってみてはいかがでしょう?
[Firebird-jp-general (Yahoo!グループ)]
http://groups.yahoo.co.jp/group/Firebird-jp-general/
今回の件はどちらかというと Delphi というよりもFirebird の話なので、
詳しい方がいらっしゃる Firebird-jp-general で質問した方が
確実な回答が得られると思います。
# ここの URL を貼っておくと話が早いかと思います。
DEKOさん、ありがとうございました。
さまざま教えて頂きまして、感謝申し上げます。
DEKOさん
いろいろありがとうございました!
下記で検索したところ、
>[Firebird-jp-general (Yahoo!グループ)]
TIBDatabaseInfo.UserNamesで取得できました!
しかも、Firebird1.5でも取得できたんです!
ありがとうございました!
> TIBDatabaseInfo.UserNamesで取得できました!
おー!TIBDatabaseInfo でイケるのですね φ(._.)メモメモ
大変参考になりました。
ツイート | ![]() |