今日、Npgsql という名前の PostgreSQL C# ライブラリで動作する次のコードを書きました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
namespace PostgreSQLNotificationsTest
{
class Program
{
static void Main(string[] args)
{
using (var conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=my_password;Database=helper_db.psql;SyncNotification=true"))
{
conn.Notification += OnNotification;
conn.Open();
using (var command = new NpgsqlCommand("listen notifytest;", conn))
{
command.ExecuteNonQuery();
}
Console.ReadLine();
};
}
private static void OnNotification(object sender, NpgsqlNotificationEventArgs e)
{
Console.WriteLine("event handled: " + e.AdditionalInformation);
}
}
}
それから私は次のことをします
createdb.exe -h 127.0.0.1 -p 5432 -U postgres -W helper_db.psql
psql.exe -h 127.0.0.1 -p 5432 -U postgres -W helper_db.psql
テーブル ヘルパーを作成します (最初のテキスト主キー、2 番目の整数);
CREATE OR REPLACE FUNCTION nf() RETURNS TRIGGER AS $$
BEGIN
PERFORM pg_notify('notifytest', format('INSERT %s %s', NEW.first, NEW.second));
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER any_after AFTER INSERT OR UPDATE OR DELETE ON helper FOR EACH ROW EXECUTE PROCEDURE nf();
ヘルパー値に挿入します('first', 10), ('second', 20);
C# プロジェクトでは、次の出力が得られます。
イベント処理: INSERT 最初の 10
「イベント処理: INSERT 20 秒」はありません。「ヘルパーから削除」のような次の操作をしたときだけ受け取ります。
なんで?