--- 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を含める