• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL Serverトリガの中でDMLの種類判断)

SQL Serverトリガの中でDMLの種類判断

jamshid6の回答

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

SQL Serverの場合、insertedとdeletedのデータ有無で判断するのが、一般的です。 両方あれば、UPDATEです。

関連するQ&A

  • トリガに排他制御をかけたいのですが

    トリガに排他制御をかけたいのですが Oracleのトリガで、 トリガ内の処理に対して排他制御をおこないたいのですが、 どのように設定すればよいのでしょうか? トリガの内容は以下となります。 CREATE OR REPLACE TRIGGER TRI_TEST after update of (トリガの実行条件その1) on ORG_TBL FOR EACH ROW begin if (トリガの実行条件その2) THEN begin insert(実行される処理その1) EXCEPTION update(実行される処理その2) end; end if; end; / 上記の条件において、 「実行される処理その1」 「実行される処理その2」 を行っている最中に他からのアクセスをブロックをさせたく思っております。 本件の理由は 他からのアクセスで行われる処理が 「select(トリガによってデータが投入されてるテーブル)」 「truncate(トリガによってデータが投入されてるテーブル)」 を連続して行う処理のため、 排他を実行しなかった場合、 他からのアクセスの「select」と「truncate」の処理間に トリガによってレコードがinsertされた際に、 そのレコードがselectされなくなることを危惧しているためです。

  • ORACLEのトリガーについて勉強しているのですが現在詰っています。

    ORACLEのトリガーについて勉強しているのですが現在詰っています。 トリガーの内容ですが、table1のレコードがUPDATEかINSERTかDELETEが 実行された時にtable2にそのレコードすべてをINSERTしたいのですが CREATE OR REPLACE TRIGGER test_trg After INSERT or UPDATE or DELETE on table1 for each row  BEGIN   if inserting then    insert into (?);   elsif updating then    insert into (?);   else    insert into (?);   end if;  END; tableを使ってログを残せるようにするためこのトリガーを作ろうとしています。 この様な感じになると思っているのですが、(?)の部分をどう書けばいいのか がよくわかりません。どうしても解らないので教えていただければ幸いです。 何卒よろしくお願いします。

  • トリガって、自分自身のテーブルを操作することはできない?

    あるテーブルに行を挿入すると、そのテーブルの1分前以上に挿入された 行を全て削除するようなトリガーの作成は可能でしょうか? トリガーは作れましたが、そのテーブルに行を挿入すると、 > Can't update table 'submitted' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. といわれます。 トリガって、自分自身のテーブルを操作することはできないんですか? 例えば、table_a に行を挿入すると、table_a に行を挿入するトリガーを 作るのは、無限ループになるので駄目なのは分かります。 でも、table_a に行を挿入すると、table_a のある行を削除するトリガーも 作れないようですがどうしてでしょう?

    • ベストアンサー
    • MySQL
  • Access(Jet4.0)SQLでGRANTが使用できない

    AccessでGrantを使った以下のようなSQLクエリを実行し、 特定のユーザに読み取り権限の付与・削除を 行おうとしているのですが、正常に実行されません。    grant select on [DbName] to [UserName] エラーの内容としては 『SQLステートメントが正しくありません。 'Delete'、'Insert'、'プロシージャー'、'Select'または 'update'を使用してください』 とのメッセージが表示されます。 管理者権限でログインしてユーザー権限のユーザを 指定して処理を行っています。 構文も間違っていないと思うので、原因がつかめず困惑しています。 心当たり、間違い等、可能性レベルでも結構ですので ご教授・ご指摘いただけますようお願いいたします。

  • トリガで複数行のインサートを実行したい

    mysql 5.5.16で、全体ユーザーから誕生日が来た人だけを選別する仕組みを作っています。 テーブル user (id_1 INT, user_1 TEXT,count_1 INT,nextbirthday_1 DATETIME) テーブル 20years (id_2 INT, user_2 TEXT,nextbirthday_2 DATETIME) userテーブルには1000人の19才ユーザーが配置されています。 このリストから「20才の誕生日が着たら20yearsテーブルに複写させる」ことを考えました。 まずは、EVENT でrecordにある1000人のユーザー全ての count_1 を毎日1回づつUPDATEさせます。 このアップデートをTRIGGERとして、誕生日と現在時間を見合わせ、誕生日が現在時間より古いユーザーは(誕生日が来たものは)20yearに複写させることを考えました。 その案が下記のEVENT とTRIGGERです。 ******************************** CREATE EVENT happybirthday ON SCHEDULE EVERY 1 DAY STARTS '2012-04-25 09:00:00' ENDS '2013-03-31 09:00:00' DO UPDATE record SET count_1 = count_1 + 1; ******************************** DELIMITER // CREATE TRIGGER 20_trigger AFTER UPDATE ON record FOR EACH ROW BEGIN IF(SELECT NEW.nextbitthday_1 <= NOW()) THEN INSERT INTO 20years SET id_2=NEW.id_1,user_2=NEW.user_1,nextbirthday_2=NEW.nextbirthday_1 ON DUPLICATE KEY UPDATE id_2=NEW.id_1; END IF; END; // DELIMITER ; ******************************** FOR EACH ROW BEGIN で全てのユーザーの誕生日を見に行き、誕生日に4人が該当すれば4人が20yearsに複写されるはずです。 しかし実際には、該当する一番上の一人だけしか複写させることが出来ませんでした。 (本日誕生日のユーザーが4人いて、4/16以前が誕生日の人が10人いた場合、それら合計14人のうち、userテーブル上で一番上に位置するユーザーだけが複写される) このトリガの書き方では、FOR EACH ROW BEGINと設定しているにも関わらず、全てのユーザーに対してトリガ作業を行わず、上から一人目を抽出した時点で作業を終了しているようです。 アドバイスを頂けましたら幸いです。 尚、ニーズは誕生日が来たユーザーだけを移動することですので、私の発案の方法に限らずもっといい方法があればアドバイスをお願いいたします。 追伸 IF節を全て外しても同様に一人しか抽出しませんでしたので、IF節が悪さをしている訳ではないようです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • トリガーについて

    このジャンルでお願いします。 次のようなテーブルで DROP TABLE IF EXISTS item; CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, parent_id INT, name varchar(32) NOT NULL, level int NOT NULL, FOREIGN KEY (parent_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7'); INSERT INTO item (parent_id, name) VALUES (null, 'item8'); DROP PROCEDURE IF EXISTS UPDATE_LEVEL; DELIMITER // CREATE PROCEDURE UPDATE_LEVEL() BEGIN DECLARE CNT INT; DECLARE LVL INT; SET LVL=1; UPDATE item SET level=0; UPDATE item SET level=LVL WHERE parent_id IS NULL; SELECT COUNT(*) INTO CNT FROM item WHERE level=LVL; WHILE CNT>0 DO UPDATE item INNER JOIN (SELECT id FROM item WHERE level=LVL) as temp ON parent_id=temp.id SET item.level=LVL+1; SET LVL=LVL+1; SELECT COUNT(*) INTO CNT FROM item WHERE level=LVL; END WHILE; END // DELIMITER ; DROP TRIGGER IF EXISTS TRG_INSERT_ITEM; DELIMITER // CREATE TRIGGER TRG_INSERT_ITEM AFTER INSERT ON item FOR EACH ROW BEGIN CALL UPDATE_LEVEL(); END; // DELIMITER ; itemテーブルにinsertした場合にトリガーでUPDATE_LEVEL()を実行するようにしているのですが、 実際に挿入すると、 >Can't update table 'item' in stored function/trigger because it is already used by statment which invoked this stored function/trigger . このようなエラーが出てしまいます・・・ UPDATE_LEVEL()にinsertらしき記述はないと思うのですが、 これはなぜこのようなエラーが出るのでしょうか?

    • ベストアンサー
    • MySQL
  • 特定カラム値が規定値以上になった場合発動するトリガ

    MySQLのトリガについて教えてください。 投票システムを作っています。 テーブル名 abc ( abc1_id(プライマリ) , abc2_vote_volume(INT) ) テーブル名 def ( def1_id(プライマリ) , def2_vote_volume(INT) ) があります。 テーブル名 abc にある abc2_vote_volume(INT)にはユーザーが1票づつ投票します。 abc2_vote_volume(INT)が49までのうちは何も起こらず、 abc2_vote_volume(INT)が50を超えたら「テーブル名 def 」に全てをコピーしていくトリガの作成を考えました。 私が考えたのは下記の表現なのですが、エラーとなります。 FOR AS IF UPDATE 49<NEW.adc2_vote_volume が見るからに怪しいのですが、改定方法が分かりません。 詳しい方、ご教授頂けますようお願いいたします。 DELIMITER // CREATE TRIGGER a_ref AFTER UPDATE ON abc FOR AS IF UPDATE 49<NEW.adc2_vote_volume INSERT INTO def SET def1_id =NEW.abc1_id,abc2_vote_volume=NEW.abc2_vote_volume ON DUPLICATE KEY UPDATE def1_id =NEW.abc1_id,abc2_vote_volume=NEW.abc2_vote_volume; END; // DELIMITER

    • ベストアンサー
    • MySQL
  • トランザクション使用

    DBファサードによるDB操作で、トランザクションを使用するのは、 INSERT/UPDATE/DELETE文の場合のみで、 SELECT文は使用しないでいいのでしょうか?

  • phpmyadminはトリガーやIF文を使えますか

    mysql> delimiter $$ mysql> create trigger trigger_update after update on user for each row -> begin -> update address set name = new.name where name = old.name; -> end; -> $$ mysql> delimiter ; こちらをphpmyadminでどのようにしたら使うことができますか。

    • ベストアンサー
    • MySQL
  • asp.NET内でSQLプロシージャを実行させた

    お世話になります。  SQL2000+asp.NETの環境で、SQLのプロシージャを実行させようとしています。 このプロシージャはテキストファイルを読み込んでデータベースに追加・削除するもので、ここで使用している関数は  ・DELETE/UPDATE/INSERT  ・BULK INSERT  ・CURSOR です。このプロシージャを実行させるには「.NETユーザー」に対し、  サーバーロールにてbulkadmin  ユーザ権限にてdd_ddladmin の権限を付与すれば実行されることは確認しています。  ここで、ご質問なのですが、asp.NETでプログラミングされていらっしゃる方は、普通にWEBログインユーザーに上記権限を付与していらっしゃるのか知りたいのです。  逆に、この権限付与は危険だからsubプロシージャにて記述したほうがいいよとかお教えいただければ、と思います。  以上よろしくお願いいたします。