2

私は現在、SQLiteを使用するアプリケーションを書いています。SQLiteにはタイムスタンプの関数がないON UPDATEので、最初のトリガーを作成しました。次に、挿入の変更および作成されたフィールドに現在のタイムスタンプを追加するトリガーを作成しました。

問題は、挿入の変更/作成されたフィールドの設定を削除したときに発生しました。将来自分のコードが表示される可能性のあるものを開発者から隠しているような気がしました。それは混乱の原因となる可能性があります。

SQLがトリガーから来ていることをどうやって知るのでしょうか。コメントする必要がありますか?それは悪い習慣ですか?

4

4 に答える 4

2

経験則として、トリガーは、包含、除外、パーティションなどのSQL機能ルールを実装することを目的としています。この種のものはモデルに属し、可能な場合は常にトリガーとして実装する必要があります。データベースと一緒に配信する必要があります。そうしないと、モデルが壊れてしまいます。

あなたの場合に関しては、それは何よりもハックです。別の方法で行うことができない場合は、それを行ってから、あなたが言ったようにコメントを追加してください。しかし、それは例外のままでなければなりません。

トリガーが実行しているほとんどすべてのことは、アプリケーション層(必要な方)で実行できることに注意してください。

于 2013-03-06T23:00:42.953 に答える
1

良い観察。トリガーだけができることがいくつかあります。ただし、トリガーを使用する代わりの方法がある場合は、その方法を使用することをお勧めします。私はSQLiteに精通していませんが、他のデータベースでは、トリガーではなくDEFAULTを使用して新しいレコードにタイムスタンプを付けます。更新された日付をキャプチャするために、これをストアドプロシージャ、またはデータベース側のロジック(RandomUs1rが提案したものの種類)で囲みます。トリガーを検討するかもしれませんが、それは非常に基本的な操作のみです。

トリガーが混乱し、デバッグが困難になる可能性があることは正しいです。

于 2013-03-06T23:00:22.567 に答える
1

「開発者に何かを隠しているように感じました...」 - これは非常に良い点です。@@Identity を使用する多くの開発者に出くわしましたが、誰かが別の行を挿入するトリガーをテーブルに置くと、間違った ID で終わることに本当にショックを受けました。(SCOPE_IDENTITY() とは対照的に - これらは SQL サーバー固有のものであることは知っていますが、私が知っているのはそれだけです...)

それは隠されています - ドキュメントを除いて、あなたがそれをより見やすくすることができるかどうかはわかりません。

これが、多くの人が可能な限りそれらを避ける理由です-場合によってはそれらを使用する簡単な方法がない場合は、十分に文書化されている限り、.. .しかし、それらを回避できれば、おそらく最善です。

于 2013-03-06T23:06:42.523 に答える
0

レコードを変更するコードで、現在のタイムスタンプを取得するには... SQLLite で、次を試してください。

DATETIME('NOW')
于 2013-03-06T22:57:24.337 に答える