インストール不要のDBサーバーを試してみました。
SQLite
DLLを置けば、使えますね。
新しいDelphiだとFireDACで、SQLiteに接続ができるようですが、
手持ちの最新は、XE5。
オープンソースのコンポーネントを使って、
試してみましたが、inner join 程度のレベルなんですが、
いいコンポーネントがなかったというのが、
MS ACCESS
ADOで接続できるので、期待したのですが、
テーブル同士の結合がとても面倒だったので、断念。
で、今回の本命
Firebird
Delphiの初期の頃に付属していたInterbaseから派生した
オープンソースのRDBS「Firebird」ですが、
もともとDelphiと親和性が高いため、コンポーネントも標準でついており、
期待感はとても高かったのですが、
日本語カラム(テーブル名も)が指定できません・・・
そういえば、昔Interbaseを使っていたときは、
アルファベットでテーブルを作っていたな。。。
当時は、マルチバイトの対応がまだまだだったので、
そんなもんだと、諦めていましたが、
今では、ほとんどのRDBSで、日本語テーブル・カラムが使えるのに・・・
まさか、新しいFirebirdで日本語が使えないとは、とても思いませんでした!
でも、多くのDBエンジニアは、英語名でカラムを作ってるんですね。
https://thinkit.co.jp/free/tech/31/3
その比率も、
オラクル関連とマイクロソフト関連の両方のカンファレンスで講演する機会があったのですが、Oracle技術者主体だと9対1で日本語を利用しない方が圧倒的に多かったのですが、SQL Server技術者主体だと5対5といった結果でした。
私は、英語だと、列名が長くなりすぎるので、絶対に日本語派!
最後に、Firebird Embedded Serverを使うため調査履歴
ということで、
たかだかこの程度のことに、使いたくはなかったのですが、
親に使っていたSQLSERVER Expressを各クライアントにインストール・・・
と思ったところ、
サービスとしてではなくアプリケーションのプロセス内で実行される SQL Server Express の軽量展開オプションである SQL Server Express LocalDB を使って、小規模なデータベースを基本的なデスクトップ アプリケーションやデスクトップ ツールに構築することができます。
https://www.microsoft.com/ja-jp/sql-server/sql-server-editions-express
ということで、
SQL SERVER EXPRESS Local DB!!!
https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/sql-server-2016-express-localdb?view=sql-server-2017
※英語のみ
Install LocalDB through the installation wizard or by using the SqlLocalDB.msi program. LocalDB is an option when installing SQL Server 2016 Express.
最新のSQLSERVER Expressは、2017ですが、リンク先は、2016。
オプションとしてLocalDBがあるようですが、
たどっていくと、2017をインストールするしかないようです。
まあ、とりあえず、SQLSERVER Express 2017をダウンロードして、実行。
「メディアのダウンロード」を押すと、「LocalDB」がありました!
参考 >> https://www.ipentec.com/document/sql-server-2017-express-local-db-install
※このLocalDBの機能は、もっと古いエディション2012から、既にあったんですね!知りませんでした!
インスタンスの作成と起動
sqllocaldb.exeを使って、インスタンスを作り、
インスタンスを指定して、起動するわけですね。
※黒塗りのところが、「データベース名」となります。
SQLServer Expressとの違いは、サービスとしてではなく、
アプリケーションとして、起動させること。
スタートアップから、起動させる感じで。
参考 >> https://www.jetbrains.com/help/datagrip/connecting-to-sql-server-express-localdb.html
SQLSERVER Manage Studioに接続
参考 > https://blog.engineer-memo.com/2012/12/16/sql-server-localdb-にデータベースを接続/
上記で、作成したインスタンスを指定で、Windows認証で接続します。
(localdb)¥インスタンス名
で、SQLSERVER Expressでバックアップしたものを、
localDBに復元させたのですが、いとも簡単に・・・
SQLCMDで接続
など、SSMSは軽量版がほしいほど、非常に巨大な容量のアプリなので、
データバースの登録程度で、インストールするには、
億劫なので、CLIを使います。
上記の「sqllocaldb info {instance}」で取得した、
パイプ付きのアドレスを用いて、接続します。
sqllocaldb -S np:\\.\pipe\LOCALDB#123BAA99\tsql\query
ログイン後、
craete databaase {database}
で、作れると思いきや、エラーです・・・
ファイルのアクセス権がないとされるが、
エラーの3行目(全体で5行目)に、
‘c:\users\◯◯山01test.mdf’
という表記があるが「¥」が足りないのが、原因だと思われるが、
同しようもないので、別の方法。
※開発用のPCには、当然巨大なSSMSが入っているので、
そこで作成したDBを認識させたかっただけで、
空のデータベースを作ってから、ファイルを上書きすればいいや。
と思っていたのですが、、、、
ということで、正当に「アタッチ」して、認識させました。
createa database test on
(filename = ‘c:\users\{username}\test.mdf’),
(filename = ‘c:\users\{username}\test_log.ldf’)
for attach
参考 >> https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/move-a-database-using-detach-and-attach-transact-sql?view=sql-server-ver15
Delphiからの接続
FireDACなど最新品を持ち合わせていないので、TADOConecctionで接続します。
いつもは、「Microsoft OLE DB Provider for SQL Server」でつないでいましたが、
今回は、「SQL Server Native Client 11.0」を指定します。
理由は、ここにそう書いてあったのでw
http://linyi-zatta.blogspot.com/2013/02/localdb.html
はい、続いて、SSMSと同様に。
以上です。
コンパイルして、実行してみると、変更するコード・SQLは一切なく、
スタンドアローンで、動いてくれるように!
あとは、集計時に、AWS RDSに吸い上げるロジックを作れば、完成ですが、
SQLをまったく変更する必要がなかったことで、
ずいぶん時間を節約することが出来ました!
ほんと、ExpressやSSMS、無料で商用に使わせてもらえる
SQLSERVER様 素晴らしい限りですね!
経緯
SQLServerを入れた親にも、忙しいときには、
作業が出来るように、アプリを入れているんですが、
不具合が起きると、他の正常なPCで作業ができなくなるため、
再起動出来ないという、罠にハマってしまい、
この対策のために、対策することになりました。
AWS RDSにSQLSERVER Expressがあり、
これを親として使おうと思ったわけですが、
インターネットに接続必須というが出来てしまい、
接続時にちょっと時間がかかる程度で、
データの読み込みは、クラウドであるとはわからないほどの、
使用感なのですが、インターネットが切れると動かないという状況を
考慮すると、やっぱり各クライアントにDBシステムが必要だなと、
ということで、軽いDBを探しました。