73 lines
4.0 KiB
Markdown
73 lines
4.0 KiB
Markdown
---
|
||
description: 'SQLステートメントとストアドプロシージャ生成のガイドライン'
|
||
applyTo: '**/*.sql'
|
||
---
|
||
|
||
# SQL開発
|
||
|
||
## データベーススキーマ生成
|
||
- すべてのテーブル名は単数形にする
|
||
- すべての列名は単数形にする
|
||
- すべてのテーブルは`id`という名前の主キー列を持つべき
|
||
- すべてのテーブルは作成タイムスタンプを格納するための`created_at`列を持つべき
|
||
- すべてのテーブルは最終更新タイムスタンプを格納するための`updated_at`列を持つべき
|
||
|
||
## データベーススキーマ設計
|
||
- すべてのテーブルに主キー制約を設ける
|
||
- すべての外部キー制約には名前を付ける
|
||
- すべての外部キー制約はインラインで定義する
|
||
- すべての外部キー制約には`ON DELETE CASCADE`オプションを設ける
|
||
- すべての外部キー制約には`ON UPDATE CASCADE`オプションを設ける
|
||
- すべての外部キー制約は親テーブルの主キーを参照する
|
||
|
||
## SQLコーディングスタイル
|
||
- SQLキーワード(SELECT、FROM、WHERE)には大文字を使用する
|
||
- ネストしたクエリや条件には一貫したインデントを使用する
|
||
- 複雑なロジックを説明するためのコメントを含める
|
||
- 読みやすさのため長いクエリを複数行に分割する
|
||
- 句を一貫して整理する(SELECT、FROM、JOIN、WHERE、GROUP BY、HAVING、ORDER BY)
|
||
|
||
## SQLクエリ構造
|
||
- SELECT *の代わりにSELECTステートメントで明示的な列名を使用する
|
||
- 複数のテーブルを使用する際は、列名をテーブル名またはエイリアスで修飾する
|
||
- 代わりに結合を使用できる場合はサブクエリの使用を制限する
|
||
- 結果セットを制限するためにLIMIT/TOP句を含める
|
||
- 頻繁にクエリされる列に適切なインデックスを使用する
|
||
- WHERE句のインデックス列に関数を使用することを避ける
|
||
|
||
## ストアドプロシージャ命名規則
|
||
- ストアドプロシージャ名に'usp_'のプレフィックスを付ける
|
||
- ストアドプロシージャ名にはPascalCaseを使用する
|
||
- 目的を示す説明的な名前を使用する(例:usp_GetCustomerOrders)
|
||
- 複数レコードを返す場合は複数名詞を含める(例:usp_GetProducts)
|
||
- 単一レコードを返す場合は単数名詞を含める(例:usp_GetProduct)
|
||
|
||
## パラメータ処理
|
||
- パラメータに'@'のプレフィックスを付ける
|
||
- パラメータ名にはcamelCaseを使用する
|
||
- オプションパラメータにはデフォルト値を提供する
|
||
- 使用前にパラメータ値を検証する
|
||
- パラメータをコメントで文書化する
|
||
- パラメータを一貫して配置する(必須を最初、オプションを後)
|
||
|
||
## ストアドプロシージャ構造
|
||
- 説明、パラメータ、戻り値を含むヘッダーコメントブロックを含める
|
||
- 標準化されたエラーコード/メッセージを返す
|
||
- 一貫した列順序で結果セットを返す
|
||
- ステータス情報を返すためにOUTPUTパラメータを使用する
|
||
- 一時テーブルに'tmp_'のプレフィックスを付ける
|
||
|
||
## SQLセキュリティベストプラクティス
|
||
- SQLインジェクションを防ぐためすべてのクエリをパラメータ化する
|
||
- 動的SQLを実行する際にはプリペアドステートメントを使用する
|
||
- SQLスクリプトに認証情報を埋め込まない
|
||
- システム詳細を公開しない適切なエラーハンドリングを実装する
|
||
- ストアドプロシージャ内での動的SQLの使用を避ける
|
||
|
||
## トランザクション管理
|
||
- 明示的にトランザクションを開始しコミットする
|
||
- 要件に基づいて適切な分離レベルを使用する
|
||
- テーブルをロックする長時間実行されるトランザクションを避ける
|
||
- 大容量データ操作にはバッチ処理を使用する
|
||
- データを変更するストアドプロシージャにはSET NOCOUNT ONを含める
|