1

いくつかのアプリケーション セキュリティ ログ テーブル (ユーザーがログインしたとき、別のファイルにアクセスしたときなど) を再設計して、いくつかの変化する要件に対応しようとしています。それらはもともと で作成されてMyISAMいましたが、それほど頻繁にアクセスされることはなくInnoDB、データの整合性のために一連の外部キーに切り替えて追加することは、実際にはより有益です。いずれにせよテーブルを作り直さなければならないので、これまでになく切り替えを行う良い機会だと思います.

ほとんどの場合、すべてが単純な外部キーであり、期待どおりに機能します。私が何か奇妙なことを試みて問題を抱えている唯一の部分は、user_idsです。これらのログ テーブルの各レコードは us​​er_id に関連付けられており、レコードが挿入されたときに指定された user_id が存在することを確認したいと考えています。ユーザーテーブルを参照する外部キーを追加すると、その問題が解決されます-簡単なことです。以下に、簡潔で代表的な表をいくつか示します。

ユーザーテーブル

CREATE TABLE tbl_user (
  id INT(10) NOT NULL AUTO_INCREMENT,
  first_name VARCHAR(50),
  PRIMARY KEY(id)
) ENGINE=InnoDB; 

ログテーブルの例

CREATE TABLE tbl_login_time (
  id INT(10) NOT NULL AUTO_INCREMENT,
  user_id INT(10) NOT NULL,
  login_at TIMESTAMP NOT NULL,
  PRIMARY KEY(id),
  CONSTRAINT 'tbl_login_time_fk_1` FOREIGN KEY (user_id) REFERENCES tbl_user
      ON UPDATE CASCADE ON DELETE ???
) ENGINE=InnoDB; 

私の問題は、挿入、更新をカスケードするために外部キーを適用したいが、tbl_user のレコードを削除しても tbl_login_time にまったく影響を与えないようにすることです。通常、ユーザーは非アクティブとしてマークされますが、たまにユーザーが完全に削除されることがありますが、ログを維持する必要があります。

MySQL ドキュメントにはの6 つのオプションがリストされていますがON DELETE、どれも適切ではありません。

  1. RESTRICT : tbl_user での削除を防止します。
  2. NO ACTION : RESTRICT と同様に評価されます。
  3. CASCADE:私が望むようにtbl_userで削除しますが、tbl_login_timeでも削除します。
  4. SET NULL : tbl_user で削除し、tbl_login_time で行を残しますが、データを null にします。閉じますが、葉巻はありません。
  5. SET DEFAULT : MySQL はそれを認識しますが、拒否します。
  6. 省略 ON DELETE : RESTRICT と同等。

私はこれまでこのような外部キーを使用したことがありません (強制INSERTandUPDATEではありませんDELETE)。他の多くの質問を読んだ後、他の誰かも使用しているようには見えません。おそらく、これは間違ったアプローチであることがわかるはずですが、何とか機能しますか?

4

1 に答える 1

2

私の問題は、挿入、更新をカスケードするために外部キーを適用したいが、tbl_user のレコードを削除しても tbl_login_time にまったく影響を与えないようにすることです。

外部キー制約ではそれを実現できません。

一部のアプリケーションでは、ON DELETE SET NULL が理にかなっています。ただし、アプリケーションは基本的に、SQL データベースに格納されたログ ファイルです。識別情報 (ユーザー) を削除したいが、場合によっては ID 番号を保持したいという重大な問題があります。率直に言って、ユーザー 23332 が誰であるかを特定できるかどうかを気にせずに、ユーザー 23332 が今日の 18:40 にログインしたという事実を喜んで保持する理由がわかりませ

いくつかのオプションがあります。

  • ログファイル テーブルを削除し、ログファイル データをデータベースではなくファイル システムのファイルに格納します。私があなたの立場なら、まずこれを検討します。Web 経由で何らかの方法でアクセスできるデータベースについて話している場合は、ログ ファイルが Web ルートの外に保存されていることを確認してください。(他のすべてのログ ファイルと一緒に /var/log に保存します。)
  • 外部キー制約を使用し、ユーザーを削除しないでください。
  • 外部キー制約を使用し、ON DELETE SET NULL または ON DELETE SET DEFAULT の影響を受けます。この特定のアプリケーションでは、ON DELETE SET NULL と ON DELETE SET DEFAULT は意味的に同等です。どちらも、適切なデータをユーザーを特定しないデータに置き換えます。とにかくユーザー 23332 を特定できない場合、彼女が今日の 18 時 40 分にログインしたことを知っているかどうかは誰が気にしますか?
  • 外部キー制約を削除し、トリガーを使用して好きなことを行います。

最も明白なオプション (ON DELETE CASCADE で外部キーを使用する) は、アプリケーションにとって単に間違っていることに同意します。

于 2013-01-28T22:08:54.657 に答える