sql database でも使えるほにゃらら
DESCRIPTION
2014/10/04 SQL Server 収穫祭 http://jazug.doorkeeper.jp/events/14622TRANSCRIPT
SQL Database でも使える○ ×※△
2014/10/04 SQL Server 収穫祭JAZUG お だ
自己紹介
織田 信亮 ( おだ しんすけ )大阪で開発者していますSQLWorld の代表です
http://odashinsuke.hatenablog.com/Twitter:@shinsukeoda
SQLWorld って?
SQL Server を中心に DB の勉強会やってます正規化 / モデリング , NoSQL とかもやってますSQL を書くハンズオンやってます
平日夜開催 (2H 程度 )提示されたお題に対して、 SQL を書いてみる検索だけ (SELECT) 4, 5 問
DB インストールしてないとダメなの?
DB のインストール必要無しですブラウザがあれば参加出来ますやろうと思えば、オンラインでも可
http://tsqlrunner.azurewebsites.net/
何回か開催していると問題が…
テーブル名が被ることが出てくる
スキーマ (Schema) を分けることで解消クエリに スキーマ 指定させるのイケてないselect * from [20140805].[ テーブル ]
開催回毎に ユーザー を作成し「既定のスキーマ」を指定する
アプリ側は同じクエリを投げても、ユーザーによって見るテーブルが変わる
テーブル定義の取得
T-SQL で取得しますカタログ ビューsys. ~
情報スキーマ ビューINFORMATION_SCHEMA. ~内部的には カタログ ビュー 使ってます
やりやすい方を使えば良いです。
余計なことをさせたくない!
自由にクエリを書けることの弊害
DROP TABLE されたらどうするん?DDL 系の操作データの追加 / 変更 / 削除
権限 ( やロール ) の設定で対応GRANT SELECT / DENY ~ロールの場合は db_datareader や カスタム作成したロール
余計なことをさせたくない!
その2
リソースを食い尽くす嫌なやつ
フロー制御言語を使った嫌がらせWHILE 無限ループWAITFOR 長時間ブロック
CTE( 共通テーブル式 ) を使った無限再帰クエリ
SELECT なので権限云々では防げない例:今から毎日分の日付を延々と返すクエリwith [CTE] ( [日付 ] ) as ( select getdate() union all select dateadd(d, 1, [日付 ]) from [CTE] ) select * from [CTE] option (maxrecursion 0)
SQL Server 側では難しそう…
ScriptDom
.NET から使える T-SQL の Parser / GeneratorSQL Server Feature Pack からインストールSQL Server 2008 位からあるようです
2008 当時と 2012/2014 では 名前空間 の構成が違うので注意
Parser/Generator
各バージョン毎の Parser/Generator80(2000)/90/100/110/120(2014)新しい構文は古い Parser ではエラーになるAzure SQL Database 用はありません!Generator である程度は書式整形出来る
Parser を使って…
複数バッチ / 複文 を NGSELECT でないと NGMAX RECURSION を指定してると NG
権限では防げないような物でも大体OK!
ScriptDom をどこで使うか
ビルド時の .sql 検証構文エラー / 規約違反
クエリの書式統一クエリの動的生成
使ってみたらわかるけど、結構面倒で非現実的…
おまけ
SQL Database で対応しているか調べる Visitor を作ってましたが…
ドキュメント (MSDN) と 実環境 とでちょいちょい乖離が…進化のスピード早いし、ドキュメントが追い付かないのもしゃーない結局 SQL Database で動かしてみないと判らん
どのクエリが良いのか比べたい!
テーブルも多くて 3 個、データ数も 2 桁インデックスもクラスタ化 (PK) のみ
速度を比較しても…比較は難しい感
あえて可読性くらい?
実行プラン 出してみた
実行プランは XMLオプション指定すると、クエリで取れるSET SHOWPLAN_XML ON
SET SHOWPLAN_XML ONGOselect * from ~GOSET SHOWPLAN_XML OFF
SqlCommand で投げる場合
GO が使えないGO は T-SQL ではないSSMS/sqlcmd 等で認識されるコマンド
Execute を分けて実行using (var conn = new SqlConnection(ConnStr))using (var cmd = new SqlCommand(@"SET SHOWPLAN_XML ON", conn)) { conn.Open(); cmd.ExecuteNonQuery(); cmd.CommandText = "select * from [MemTable] where [Id] <= 100"; File.WriteAllText("Plan.sqlplan", cmd.ExecuteScalar() as string);}
Html-query-plan
http://code.google.com/p/html-query-plan/
XML => XSLT 経由で HTML に変換JavaScript + CSS も使ってますサンプル通りの使い方でほぼOKC# 側は XslCompiledTransform で OK実行プランの線が表示されてないのは未調査。。
まとめ
SQL Server/SQL Database には、普段あまり目にしない / 使ってないものがまだまだあると思います。
色々使って試してみましょう!