FireBirdでログインしているユーザー名を取得したい(追加)

解決


ぼくどらえもん  2013-09-21 02:59:00  No: 45302  IP: [192.*.*.*]

2013/09/13の60のおじんさんの質問と同じく
私も困っておりました。

DECOさんのとおり、
下記SQLを実行したところ、エラーがでました。

/* 現在接続しているクライアントのユーザ名を取得する */
SELECT rdb$get_context('SYSTEM', 'CURRENT_USER') FROM rdb$database;

Function Unknown

どうしたらよいのでしょうか??

編集    削除
ぼくどらえもん  2013-09-21 03:00:36  No: 45303  IP: [192.*.*.*]

9/18でした。

編集    削除
DEKO  2013-09-21 06:53:48  No: 45304  IP: [192.*.*.*]

スミマセン 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

編集    削除
60のおじん  2013-09-21 18:00:05  No: 45305  IP: [192.*.*.*]

便乗ですいません。
教えてもらって、あれからいろいろやったんですけど、同じようにエラーが出ていました。原因がわかってよかったです。

DEKOさん、誠にすいませんがInterBaseを使用しないで、できる方法はないんですよね???。
そうなると TIBSecurityService を使ってユーザリストを取得するしかないと思います。・・・と書いてますので。

編集    削除
DEKO  2013-09-21 23:37:11  No: 45306  IP: [192.*.*.*]

> 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

編集    削除
ぼくどらえもん  2013-09-25 01:18:03  No: 45307  IP: [192.*.*.*]

DEKOさんありがとうございます。

IBSecurityServiceを使用してやってみましたが、
DisplayUsersでエラーがでます。
RDB$USRSがないというSQLエラーでした。

ちなみに、Firebird2.1でも同様のエラーがでました。

Delphiは6と2010です。
接続はSQLConnectionをしようしてます。

編集    削除
DEKO  2013-09-25 03:06:31  No: 45308  IP: [192.*.*.*]

> IBSecurityServiceを使用してやってみましたが、
> DisplayUsersでエラーがでます。
> RDB$USRSがないというSQLエラーでした。

RDB$USERS のエラーが出るという事は UserDatabase を指定されているのだと思います。

これを指定すると RDB$USERS というシステムテーブルを読みに行きますが、
RDB$USERS は Interbase 7.5 で追加された Interbase 固有のテーブルであるので、
Firebird では使えません (MON$ATTACHMENTS が Firebird 固有なのと同じです)。

編集    削除
ぼくどらえもん  2013-09-25 03:20:21  No: 45309  IP: [192.*.*.*]

DEKOさん、ありがとうございます!

確かにUserDatabase指定しておりました。
削除したら、User取得できました。

IBSecurityServiceは初めて使用するので、
わからないのですが、
すみません、これから自分なりに調べてみますが。
登録ユーザー全部取得して、
そのうちのどのユーザーがアクセス中なのかって
取得できるのでしょうか??

編集    削除
DEKO  2013-09-25 03:28:18  No: 45310  IP: [192.*.*.*]

...ここまで書いて思ったのですが、60のおじんさんもぼくどらえもんさんも 
"Firebird サーバに接続しているユーザの一覧" ではなく
"Firebird データベースに接続しているユーザの一覧" を取得したいのですかね? 

だとすると、Firebird 2.1 またはそれ降が必要になる思います。

"Firebird サーバに接続しているユーザ一覧" であれば
IBSecurityService を使えばすべてのバージョンの Firebird で取得可能です。
(UserDatabase を指定しなければサーバに接続しているユーザが取れます)

編集    削除
DEKO  2013-09-25 03:31:11  No: 45311  IP: [192.*.*.*]

> 登録ユーザー全部取得して、
> そのうちのどのユーザーがアクセス中なのかって
> 取得できるのでしょうか??

TIBSecurityService.ActiveUser := True;
あるいは、
TIBSecurityService.UserInfo[].ActiveUser を調べればいいかと。

編集    削除
60のおじん  2013-09-25 06:19:17  No: 45312  IP: [192.*.*.*]

すいません。60のおじんです。
私は、"Firebird データベースに接続しているユーザの一覧" を取得したい
のです。今現在、サーバーマシンにあるXXX.FDBにアクセスしているユーザー名の一覧です。

なお、以前書きましたが、Delphi6でFirebird1.5です。

編集    削除
DEKO  2013-09-25 16:14:32  No: 45313  IP: [192.*.*.*]

> 私は、"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のおじん  2013-09-25 19:16:54  No: 45314  IP: [192.*.*.*]

60おじんです。DEKOさんいろいろありがとうございます。
とすると、今サーバーでは、Firebird  1.5で動いているので、上記は無理だと解釈してよろしいのでしょうか。
何度も、恐縮です。

編集    削除
DEKO  2013-09-25 20:11:58  No: 45315  IP: [192.*.*.*]

> 上記は無理だと解釈してよろしいのでしょうか。
私は無理だと思っているのですが、
気になるようでしたら以下でお尋ねになってみてはいかがでしょう?

[Firebird-jp-general (Yahoo!グループ)]
http://groups.yahoo.co.jp/group/Firebird-jp-general/

今回の件はどちらかというと Delphi というよりもFirebird の話なので、
詳しい方がいらっしゃる Firebird-jp-general で質問した方が
確実な回答が得られると思います。

# ここの URL を貼っておくと話が早いかと思います。

編集    削除
60のおじん  2013-09-25 22:04:38  No: 45316  IP: [192.*.*.*]

DEKOさん、ありがとうございました。
さまざま教えて頂きまして、感謝申し上げます。

編集    削除
ぼくどらえもん  2013-10-02 20:23:39  No: 45317  IP: [192.*.*.*]

DEKOさん
いろいろありがとうございました!

下記で検索したところ、
>[Firebird-jp-general (Yahoo!グループ)]

TIBDatabaseInfo.UserNamesで取得できました!
しかも、Firebird1.5でも取得できたんです!

ありがとうございました!

編集    削除
DEKO  2013-10-03 19:28:16  No: 45318  IP: [192.*.*.*]

> TIBDatabaseInfo.UserNamesで取得できました!
おー!TIBDatabaseInfo でイケるのですね φ(._.)メモメモ

大変参考になりました。

編集    削除