問題タブ [triggers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - トリガーを使用して制約を適用する
制約ではできないと思う方法でテーブルの整合性を強制しようとしています...
私が適用したい制約は、日付が重複する同じ「fk_item_id」のエントリがあってはならないということです。
ノート:
invalid_from は、有効期間の直後の瞬間です。
これは、次の 2 つの期間が問題ないことを意味します...
- '2008 Jan 01 00:00' -> '2008 Feb 01 00:00' (1 月全体)
- '2008 Feb 01 00:00' -> '2008 Mar 01 00:00' (2月全体)
トリガーでそのルールを確認できます。ただし、トリガーが不正な挿入/更新を検出した場合、「不正な」挿入/更新が発生しないようにする最善の方法は何ですか?
(挿入されたレコードが 2 つの有効なレコードと 2 つの無効なレコードを含む場合、2 つの無効なレコードだけを停止できますか?)
乾杯、
民主党。
編集:
上記の場合、関数を使用した制約がうまく機能しました。しかし、トリガー バージョンで RAISERROR が機能しなかった理由がわかりませんでした。
トリガーがAFTERトリガーであり、BEFOREトリガーが必要なためだと思いましたが、それはオプションではないようです...
sql - トリガーの相互再帰的な実行を防止しますか?
テーブルPresentations
とがあるとしますEvents
。プレゼンテーションが保存され、場所や日付などの基本的なイベント情報が含まれている場合、トリガーを使用してイベントが自動的に作成されます。(残念ながら、技術的な理由から、単にデータを 1 か所に保持してビューを使用することはできません。) さらに、プレゼンテーションの後半でこの情報を変更すると、トリガーは更新をイベントにもコピーします。そのようです:
ここで、顧客は、ユーザーがイベントの情報を変更した場合に、プレゼンテーションにも戻るようにしたいと考えています。明らかな理由から、逆はできません。
結局のところ、これにより各トリガーが次々と起動することになります。私ができることはlast_edit_by
、ユーザー ID を含む列を両方のテーブルに追加することです。トリガーによって特別な無効な ID が入力された場合 (たとえば、実際の人物のすべてのユーザー ID を正にし、スクリプトのユーザー ID を負にするなど)、それを終了条件として使用できます。
これはうまくいくかもしれませんが、私がやりたいことは、SQL サーバーに対して、トランザクション内でトリガーが 1 回だけ起動することを示すことです。これを確認する方法はありますか?あるいは、テーブルがすでにトリガーの影響を受けていることを確認するには?
Steve Robbins のおかげで答えてください:
ネストされている可能性のあるUPDATE
ステートメントを、 をチェックする IF 条件でラップするだけですtrigger_nestlevel()
。例えば:
trigger_nestlevel()
0 ベースではなく、1 ベースのように見えることに注意してください。2 つのトリガーのそれぞれを 1 回だけ実行したいが、それ以上は実行したくない場合はtrigger_nestlevel() < 3
、両方のトリガーをチェックします。
sql - 更新トリガーで変更されたフィールドを検出するSQL(SQL Server 2005)?
SQL Server 2005では、更新トリガー内に、元の更新クエリによって変更されたフィールド\列のリストを見つける方法があります。
150列のテーブルがあり、トリガー内で特定のフィールドが1つだけ更新されたかどうかを確認する必要があります(他のフィールドは変更されていません)。
150列を比較するために長いSQLを書くことはできますが、エラーが発生しやすく、ばかげているように見えます。
この問題を回避するための適切な方法。いくつかのsql2005apiが私の助けになることを望んでいます。
asp.net - トリガーのイベントがRepeater内のユーザーコントロール内にあるUpdatepanelにトリガーを追加するにはどうすればよいですか?
私は顧客を探すためのCustomerFinderと呼ばれるUserControlを持っています。そして、リピーターの中に「追加」ボタンがあります。Repeater_ItemCommandのイベントハンドラーを作成しました。他のページで使うから。
他のページでは、UpdatePanelにないこのユーザーコントロールを使用しています。選択した顧客の更新パネルがあります(顧客が[追加]をクリックすると、顧客が選択されます)
UserControlにある[追加]ボタンをクリックすると、更新パネルで自動的に更新されます。
(出典:barbarosalp.com)
上記のように、Intellisenseはイベント名「OnrptCustomersCommand」を取得できます
(出典:barbarosalp.com)
そしてこれがトリガーです...
「イベント'OnrptCustomersComman'が見つかりませんでした」というエラーが表示されます
どうすればそれを行うことができますか?前もって感謝します
postgresql - ビューでトリガーを実行しますか?
データベースのトリガーやビューにあまり詳しくありません。現在、PostgreSQL と HSQL を使用しています。データベースはそれほど重要ではありませんが。次のようなものを提供するデータベースがあるかどうか疑問に思っています。
次のような(例の)テーブルがあります。
次のようなビューを作成しました。
いくつかのエンティティを挿入します。
もちろん、呼び出したときに DUMMY_VIEW には VALUES(1,10) のみが含まれます
だから今私がやりたいことは、NUMBER > 5 を持つエンティティが挿入されるたびに呼び出される DUMMY_VIEW にトリガーを追加することです。
HSQL と PostgreSQL の両方で DUMMY_VIEW にトリガーを直接追加しようとしました。しかし、ビューにトリガーを追加することはできないと言われています。
これ(または機能的に同様のソリューション)は可能ですか?
sql - ID 値の列を取得する方法 - SQL
あるテーブルから別のテーブルにレコードを挿入するこの手順があります。宛先テーブルには、LeadId という ID 列があります
次に、挿入されたテーブルからLeadIdを取得し、他の値を持つ別のテーブルに挿入する挿入トリガーを作成しました-
問題は、すべての LeadIds ではなく、最初に生成された LeadiD を取得していることです。Temp_ProductsTop テーブルの LeadiD 列には、この値のみがレコード数だけ繰り返されています。
sql-server - 複数のテーブルに分割されたエンティティの監査ログを維持する
5 つの異なるテーブルに分割されたエンティティがあります。これらのテーブルのうち 3 つのレコードは必須です。他の 2 つのテーブルのレコードはオプションです (エンティティのサブタイプに基づきます)。
テーブルの 1 つがエンティティ マスターに指定されます。他の 4 つのテーブルのレコードは、マスターからの一意の ID をキーとしています。
更新/削除トリガーが各テーブルに存在し、レコードの変更後、(トリガー内の削除されたテーブルから) 履歴が関連する履歴テーブルに保存されます。各履歴テーブルには、関連するエンティティ フィールドとタイムスタンプが含まれています。
したがって、ライブ レコードは常にライブ テーブルにあり、履歴/変更は履歴テーブルにあります。履歴レコードは、タイムスタンプ列に基づいて並べ替えることができます。明らかに、タイムスタンプ列は履歴テーブル間で関連付けられていません。
さて、より難しい部分です。
- レコードは、最初は 1 つのトランザクションで挿入されます。1 回のトランザクションで 3 つまたは 5 つのレコードが書き込まれます。
- 個々の更新は、5 つのテーブルのいずれかまたはすべてに対して発生する可能性があります。
- すべてのレコードは、単一のトランザクションの一部として更新されます。ここでも、1 回のトランザクションで 3 つまたは 5 つのレコードが更新されます。
- 番号 2 は複数回繰り返すことができます。
- 番号 3 は複数回繰り返すことができます。
アプリケーションは、単一のトランザクションとしてのみ書き込まれたレコードに基づいて、ある時点の履歴エントリのリストを表示することになっています (ポイント 1、3、および 5 のみ)。
現在、タイムスタンプ データのみに基づいて履歴レコードを取得するアルゴリズムに問題があります。
トランザクションに関する追加情報を保持する HISTORYMASTER テーブルを追加すると、問題が部分的に解決されるようです。すべてのトランザクションの前に、新しいレコードが HISTORYMASTER に追加されます。新しい HISTORYMASTER.ID は、トランザクション中に各エンティティ テーブルに保存されます。特定の HISTORYMASTER.ID (タイムスタンプ順) の最初のレコードを選択することで、特定の時点の履歴を取得できます。
複数のテーブルにまたがるエンティティの AFTER (UPDATE, DELETE) TRIGGER に基づいて監査テーブルを管理する最適な方法はありますか?
sql - データベースは悪を引き起こしますか?
データベーストリガーは悪い考えですか?
私の経験では、それらは驚くべき副作用を引き起こす可能性があり、デバッグが難しいため(特に、あるトリガーが別のトリガーを起動する場合)、悪です。多くの場合、開発者はトリガーがあるかどうかを調べることさえ考えていません。
一方、FOO
データベースに新しいものが作成されるたびに発生しなければならないロジックがある場合、それを配置する最も確実な場所は、FOOテーブルの挿入トリガーであるように思われます。
トリガーを使用するのは、の設定などの非常に単純な場合のみですModifiedDate
。
sql-server - SQL Server Compare フィールド値とそのデフォルト
テーブルのフィールドを繰り返し処理し、その値がデフォルト値と等しくない場合は何かをする必要があります。
私はトリガーにいるので、テーブル名を知っています。次に、このループを使用して各フィールドをループします。
次に、ループを介して各反復でフィールド名を取得できます。
そして、その列のデフォルト値を取得できます。
必要なものはすべて揃っていますが、2 を比較する方法がわかりません。フィールド名を定数として持っていないため、変数内にのみあるため、' から値を取得する方法がわかりません。挿入されたテーブル(トリガーにいることを思い出してください)がデフォルト値と同じかどうかを確認します(現在、@ColDefaultにvarcharとして保持されています)。
sql-server - 行を削除すると、更新トリガーが起動しますか?
SQL Server 2000 では、既定で、DELETE クエリによってテーブルの UPDATE トリガーが実行されますか?
DELETE と UPDATE の両方で実行されるトリガーを定義できることはわかっていますが、これが実際に必要であることを最初に確認することにしました。