5

この質問に答えるために、トリガーを使用してクロステーブルの整合性制約をチェックすることを提案しました。コメントで、問題を引き起こす可能性があることが示唆されています。

クロス行チェックを行うトリガーは、ほとんどのデータベースでほとんど機能しません...他のトランザクションからコミットされていない行を読み取ることができないためです

ただし、この主張を裏付ける情報源は見つかりませんでした。公式 ドキュメントには何も言及されていません。私が見つけた他の問題はSO でここでカバーされています- トリガーが一目で見えないので、潜在的な隠された複雑さを主に批判しています。しかし、最高評価の回答でさえ、整合性の問題への使用を認めています。

私の質問は次のとおりです。データベース トリガーはクロス テーブル整合性制約に対して安全ですか? 具体的には、以下の解決策は機能しますか?


元の質問を要約します。テーブルがあります

  • プレーヤー - PlayerID、PlayerName
  • ベット - BetID、BetName
  • plays_in - BetID、PlayerID

制約は、BetName と PlayerID の組み合わせが一意であることです。推奨されるトリガーの定義:

CREATE TRIGGER check_bet_name BEFORE INSERT ON plays_in 
  FOR EACH ROW BEGIN
      DECLARE bet_exists INT DEFAULT 0;
      DECLARE msg VARCHAR(255);

      SELECT 1 INTO bet_exists 
        FROM Bet AS b1
        WHERE b1.BetID = NEW.BetID
          AND EXISTS (SELECT * 
            FROM plays_in AS p JOIN Bet AS b2 USING (BetID)
            WHERE p.PlayerID = NEW.PlayerID AND b2.BetName = b1.BetName
          )
        LIMIT 1;

      IF bet_exists THEN
        SET msg = "Bet name already exists...";
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
      END IF;
  END//
4

2 に答える 2

1

それはおそらく、どのデータベースと、ロジックをどれだけうまく作成するかに依存します。

infomodeler/visiomodeler の初期のバージョンは、かなり難解で複雑な形式の参照整合性をサポートし、それらを複数のデータベースに実装するためのコードを提供していました。初期のバージョンの Sybase / SQL Server は宣言型参照整合性をサポートしていなかったため、すべてのロジックがトリガーに実装されていましたが、成功しました。

私は、反例の 1 つの実装の失敗を信頼できるものとは見なしません。

于 2015-06-08T18:41:10.340 に答える