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