【スケジューラ】データを削除するタスクを作成してみる

日々データを記録し続けているテーブルがあって、どんどんサイズが膨れ上がってしまうので、古いものは消してしまいたいな～なんて思いました。更に定期的に消してくれるよう自動化したいな～とも思いました。
そこで、[Sharperlight](https://sharperlight.jp/)スケジューラで削除タスクを作ってみました。

**クエリの組み合わせ**アクションで削除するデータの年月を算出し、**SQLステートメント**アクションに渡しDELETE構文でデータを削除するといった方法で行おうと思います。

現在より2か月以前のデータは全て消してしまいます。なので現時点(2022年10月)での使用するDELETE構文は、
```
DELETE FROM [テーブル名] WHERE [captured_at] <= '2022-08-31 23:59:59' 
```
でいけるでしょう。
**クエリの組み合わせ**アクションでは、WHERE句の値の**年月**の部分を算出します。

では実際に作成に入ります。
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから**スケジューラ**を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/de18a0bc-21ba-2c6f-af62-3cf1d37bbb68.png)
### タスク情報の設定 ###
`一般`タブでは、**コード**、**グループ**および**説明**を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cdfdfaf6-f6ec-c4c8-5943-4f88ae88ee8a.png)
### アクションの設定 ###
`アクション`タブに移動し**クエリの組み合わせ**アクションを新規作成します。
**クエリの組み合わせ**アクションでは、クエリを作成して削除の対象となる年月を算出します。
`フィルター`領域では、`製品`に**システム**、`テーブル`には**日付シリーズ**を設定します。
必須フィルターである`日付時刻`と`間隔`に関しては既定値のままとし、新たに選択領域より`日付`フィールドを選択しフィルターとして使用します。この`日付`フィルターで現在から2カ月前の月を出力するようにします。
`日付`フィルターに**DATE -2m**と値を入力します。**DATE**は現在の年月日を返し、**-2m**はそこから2か月引くといった意味になります。つまり、今現在が2022年10月13日とすると、**DATE -2m**は2022年8月13日を返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/05d2b5a6-0666-2399-6f73-17e1baa6d8b9.png)
出力領域には日付フィールドを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b586e75f-ed0d-04a4-5d09-0926ca816ea2.png)
このままプレビューすると、現在より2か月前の月の全ての日付が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5be40977-2c07-556f-5d0f-17c8e7583df4.png)
しかし、ここでは現在より2か月前の月の最後の日付だけが欲しいので、つまり最後の日付をもらえればそれより過去の全データを削除することができるわけです。
WHERE xxxx <= "2022-08-31 23:59:59"
それを実現するには、**最大値**オプションを`日付`フィールドに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fa2437ab-641e-f37d-53cf-cafd870dd7ab.png)
では結果をみてみます。すると現在より2か月前の月の最終日付のみが返ってきますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9b2e4ad1-acea-3efd-1f8c-a70604c952ae.png)
これで**クエリの組み合わせ**アクションの作成は完了。
次は、**SQLステートメント**アクションの作成です。新しく**SQLステートメント**アクションを追加すると、`接続`ドロップダウンリストが表示されるので、削除対象となるデータが存在するデータベースに接続しているデータモデルを一覧より選択します。
そして`SQLステートメント`テキストフィールドにDELETE構文を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/88fffb47-0d30-6057-fd4d-b12f9de69493.png)
`ポップアウト編集`ボタンを押すとテキストエディタが起動します。****
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2571424d-837b-7780-99fa-5e69a16838d9.png)
これは実行時には、例えばこのように置き換えられます。
```
Delete from [dbo].[posted_items_history] WHERE [captured_at] <= '2022-08-31 23:59:59'
```
最後は**クエリの組み合わせ終了**アクションを追加して完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2d25408e-d87b-715b-8dd8-ca3ba2443da2.png)
### トリガーの設定 ###
`トリガー`タブでは、スケジューリングを行います。毎月1日の午前5時に動かします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3a4e5e13-1852-cf2d-fd67-d80c9cc4c679.png)
以上でタスクの作成は終了、`OK`ボタンで保存します。作成途中では`適用`ボタンで頻繁に保存することをお勧めします。
タスクを選択し、右クリックメニューから`実行`を選択してタスクを実行することもできますし、そのままにしておくと毎月1日の午前5時に実行されます。但しSharperlightサービスが起動していることが前提です。

では、失礼します。