ビジネスロジックの全体または重要な部分がDBMSのストアドプロシージャに実装されている中規模および大規模プロジェクトでは、モジュールのコードを管理する上で多くの不便があります。 すなわち:
- バージョン管理の欠如とコード変更の追跡。
- テストインフラストラクチャと運用インフラストラクチャの同期の難しさ。
- 検索、ナビゲーション、コードレビューのための手段の貧困。
はい、これらの問題を全体的または部分的に解決する商用製品がありますが、著者の意見では、これは効率的でもエレガントでもありません。 これを考慮して、データベースモジュールと構造のファイルシステムへのマッピングは、 SQLFuseプロジェクトのFUSE ( ユーザー空間のファイルシステム)を使用して実装されます。 これで、 Unixウェイのフォロワーがここを通過できるようになります。
実験データベースをマウントするための一連のアクションを検討してください。
取り付け準備
ビルドしてマウントするには、次のソフトウェアが必要です。
- LinuxカーネルのFUSEモジュール。
- FreeTDSドライバー。
- アセンブリに必要なソフトウェア。 通常、一般的なLinuxディストリビューションではbase-develと呼ばれ、 gccコンパイラ、 makeツールなどが含まれます。
- GNU BisonおよびFlex。
FUSEカーネルモジュールがロードされていることを確認します。
modprobe -a fuse
ソフトウェアをインストールしたら、gitリポジトリのクローンを作成する必要があります。
git clone https://github.com/AlexandrMov/SQLFuse.git
プロジェクトのアセンブリは、次のコマンドによって実行されます。
make clean make
カスタマイズ
コンパイルとアセンブリが成功した場合は、 sqlfuse.conf構成ファイルを構成する必要があります。これは、クローンリポジトリのconfディレクトリにあります。
# , [global] # maxconn=1 # , SQL Server appname=SQLFuse # [AdventureWorks2008R2] # / SQL Server servername=192.168.6.50 # dbname=AdventureWorks2008R2 # , sqlfuse.auth.conf auth=advauth
authパラメーターは、 sqlfuse.auth.confファイルで定義されたグループ名を参照します。
# [advauth] # username=fuse # password=123
sqlfuse.auth.confファイルのauthパラメーターの代わりに、 sqlfuse.confファイルのユーザー名とパスワードの定義が許可されます。 これは意図的に行われたものではありません。作成
サーバーインスタンス、たとえばSQLServer \ SQLEXPRESSを指定する場合、 \文字はエスケープできません。 Active Directoryを介してログインする必要がある場合、これはユーザー名パラメーターにも当てはまります。
AdwentureWorks2008R2データベースを接続する必要があり、選択したユーザーがSQL Serverモジュールを変更するために必要なすべての権限を持っていることを忘れないでください。
既知の問題
エンコードに問題がある場合は、変換の方向を指定するto_codesetおよびfrom_codesetパラメーターを使用してみてください。
from_codeset=UTF-8 to_codeset=CP1251
このエラーが発生した場合:
Heterogeneous queries require the ANSI_NULLS and ANSI_WARNINGS options to be set for the connection. This ensures consistent query semantics. Enable these options and then reissue your query.
ansi_npw = trueパラメーターを使用して、 QUOTED_IDENTIFIER、ANSI_NULLS、ANSI_WARNINGS、ANSI_PADDINGSオプションを強制的にオン状態にします。
取り付け
クローン化されたSQLFuseリポジトリのルートにadvworksフォルダーを作成し、データベースをマウントします。
mkdir advworks ./sqlfuse -o profilename=AdventureWorks2008R2 ./advworks
-dオプションを使用すると、SQL Serverによって生成されたエラーを監視できます。
./sqlfuse -d -o profilename=AdventureWorks2008R2 ./advworks &> ./advworks.log &
モジュールの基本アクション
サーバーオブジェクトに対するいくつかの簡単なアクションの例を挙げましょう。
- MidnightCommanderでデータベース構造を表示およびナビゲートする:
- Person.Personテーブルに新しいフィールドを作成して削除する:
echo "COLUMN TestColumn NVARCHAR(50) NOT NULL" > ./Person/Person/TestColumn rm ./Person/Person/TestColumn
- HumanResourcesスキーマからdboスキーマにプロシージャをコピーします 。
cp ./HumanResources/uspUpdateEmployeeLogin ./dbo/uspUpdateEmployeeLogin
- すべてのスキームでの名前による手順の検索:
find ./ -maxdepth 2 -iname *Employee* -type f -print
したがって、モジュールの管理とナビゲーションは、ファイルのある通常のディレクトリのようになります。バージョン管理システム、パッチ、お気に入りのコードエディタを使用できます。つまり、UNIXの哲学全体がSQL Serverでも利用できます。
切り捨て操作はまだサポートされていないことに注意してください-これはコマンドの実行を意味します失敗します。 ファイルシステムレベルでブロックされていますが、列の再作成とデータ損失につながる可能性があるため、操作は推奨されませんでした。
echo " NOT NULL" >> TestColumn
編集する前に、常にモジュールのオリジナルを保持してください!
モジュールの説明を間違えた場合、または接続が切断された場合、ファイルシステムは-EFAULT (「 無効なアドレス」)エラーを返します。
サポートされているモジュール
投稿が作成された時点で、SQLFuseは読み取り/書き込み用に次のモジュールをサポートしていました 。
- ストアドプロシージャ、関数。
- 制限CHECK、DEFAULT;
- 列とトリガー。
読み取り専用の スキーム、テーブル、ビューが利用可能です 。 FOREIGN KEY、PRIMARY KEY、およびインデックス の制約は まったく表示されません 。 空き時間があれば、この機能を追加します。
混乱とより柔軟なモジュール管理を避けるために、T-SQL構文を少し単純化する必要がありました。 制約と列の定義で、テーブル記述の冗長性が削除されたことを除いて、すべてが同じままでした。 定義は次のようになります。
- 列:
/*ALTER TABLE Person.Person ADD/ALTER/DROP*/ COLUMN TestColumn DATETIME -- ...
- チェック制限:
/*ALTER TABLE Person.Person ADD/DROP*/ WITH CHECK CONSTRAINT CK_Test CHECK -- ...
- DEFAULT制約:
/*ALTER TABLE Person.Person ADD/DROP*/ DEFAULT (GETDATE()) FOR (TestColumn) -- ...
宛先テーブルに関する指示がコメント化されている部分では、SQLFuseはモジュールファイルの場所に基づいて、必要なコードの置換を自動的に行います。 ファイルのテキストで定義されているモジュールの名前は何の役割も果たしません;必要に応じて、ファイル、スキーマ、および/またはテーブルの名前に置き換えられます。 モジュールのテキストには、複数のコマンドパッケージを含めることはできません。 行く
エピローグまたは次は何ですか?
空き時間を受け取ったら、実装する計画:
- 制約とインデックスのサポート、およびテーブル、ビュー、ダイアグラムの操作。
- SQLコマンドをログに記録し、パイプまたはファイルのみで出力します。
- モジュール操作中のバックアップコピーの保存、エラー中のロールバックのサポート。
- 次の投稿では、テーブル定義の形成、および構造のSQLスクリプトへの変換について説明します。
このアイデアに興味があり、開発に参加したい人は大歓迎です。すべてのソースコードはGPLv3ライセンスの下で利用可能です。 著者は、コメントや提案を喜んでいます。
PS興味がある人は、FUSEでユーザーモードファイルシステムを開発した経験についてお話しできます。
データソース
- AdventureWorks2008R2データベース-http://msftdbprodsamples.codeplex.com/releases/view/59211 ;
- GPLv3ライセンス-http : //www.gnu.org/licenses/gpl-3.0.html
- FreeTDS- http ://freetds.org/;
- GNU Bison- http://www.gnu.org/software/bison/ ;
- フレックス-http://flex.sourceforge.net/ ;
- ヒューズ-http: //fuse.sourceforge.net/ ;
- Unixの方法に関するウィキペディアの記事-http://en.wikipedia.org/wiki/UNIX_ Philosophy