0

特定の値を超える値が入力されないようにするトリガーを作成したいと考えています。

私は少し読んだことがありますが、以下の質問を自分自身に関連付けることができません。

SQL Server で条件が満たされた場合にのみ起動するトリガー

コード:

ALTER TRIGGER Tgr_IQRating
  ON  dbo.Customer
  FOR UPDATE 
AS
BEGIN
   SET NOCOUNT ON;

   DECLARE @IQ int

   Select @IQ = IQRATING from dbo.customer

   IF (@IQ) > 150 
   BEGIN
       PRINT ('Cannot enter anything higher than 100')
   END

   ROLLBACK TRANSACTION
END

こんな感じでやってみた

IF (IQRating) > 150 
BEGIN
   PRINT ('Cannot enter anything higher than 100')
END

ROLLBACK TRANSACTION

しかし、列が見つからないというエラーが発生します。また、更新しようとすると以下が失敗します。

IF (SELECT IQRating FROM dbo.customer) > 150 
BEGIN
    PRINT ('Cannot enter anything higher than 100')
END

エラー:

メッセージ 512、レベル 16、状態 1、プロシージャ Tgr_IQRating、行 16 サブクエリ
が複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。

どんな助けでも素晴らしいでしょう。

ありがとう、

ジェイ。

4

3 に答える 3

1

これには、実際に制約を使用する必要があります。それはSQLにとってより慣用的です。

制約をチェック

于 2013-05-23T19:59:02.040 に答える
0

複数の問題があります。まず、ロールバックが IF ブロックにないため、100% の確率でロールバックします。

Select @IQ = IQRATING from dbo.customer

サブクエリの問題です。顧客には複数のレコードがあると思います! とにかく、代わりに挿入された疑似テーブルを参照する必要があります。

3 番目に、トリガーは一度に 1 行だけで動作すると考えているようです。バッチで動作します。これの手がかりは、スカラー変数を設定していることです。更新でレコードが 1 つだけになると想定するのは無責任であり、プロ意識に欠けます。

INSERT でもこのチェックを行う必要がありますか? それとも、更新時にのみ入力されるこのデータですか?

1 つのレコードが不良な場合にトランザクション全体をロールバックするか、挿入された不良レコードを見つけてそれらのデータベースのみを保持するかは不明です。それぞれの可能性のコードは異なります。

これの一部を SQL サーバー用に編集します (mysql タグは表示されませんでしたが、テキストで SQL サーバーを参照していたので推測しました)。しかし、コードは T_SQL コードのように見えます。

于 2013-05-23T19:51:47.113 に答える
0

特別な「テーブル」insertedを使用して、更新されているデータを確認する必要があります。そうしないと、他の行も含むテーブル全体を見ていることになります。

IF EXISTS(SELECT 1 FROM inserted WHERE IQRating > 150)
BEGIN
    PRINT ('Cannot enter anything higher than 150')
END

より良い解決策は、代わりRAISERRORに SQL Server 2012THROWステートメントで or を使用PRINTして、エラー メッセージが更新を開始した人に送り返されるようにすることです。

于 2013-05-23T18:25:52.867 に答える