sql >> Databáze >  >> RDS >> PostgreSQL

LISTEN/NOTIFY pomocí pg_notify(text, text) v PostgreSQL

Diskutoval jsem o tom na PostgreSQL mailing listu (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) a byl jsem informován o zdůvodnění tohoto chování.

Jejich odpověď je, že "..musíte uvozovat relnames (poslouchejte "Test"). pokud chcete, aby je server neskládal. pg_notify bere řetězec, nikoli arelname, který používá jiná pravidla." (Díky Merlinovi a Tomovi)

To znamená, že následující funguje, protože kanál je vždy nucen používat malá písmena

LISTEN ERRORCHANNEL;

NOTIFY ERRORCHANNEL, 'something!';
NOTIFY eRrorChanNel, 'something!';

Pokud byste kolem názvu kanálu přidali dvojité uvozovky, velikost písmen by zůstala zachována.

Takže s následujícím upozorněním byste obdrželi první oznámení, ale ne druhé:

LISTEN "ERRORCHANNEL";

NOTIFY "ERRORCHANNEL", 'something!'; 
NOTIFY "eRrorChanNel", 'something!';

Podobně bude fungovat následující, protože dvojité uvozovky vynucují zachování velikosti písmen ERRORCHANNEL:

LISTEN "ERRORCHANNEL";

SELECT pg_notify('ERRORCHANNEL', 'something!');

I když to nebude fungovat:

LISTEN ERRORCHANNEL;

SELECT pg_notify('ERRORCHANNEL', 'something!');

V této situaci není ERRORCHANNEL v příkazu LISTEN v dvojitých uvozovkách, takže PostgreSQL vynutí, aby byl zadán malými písmeny. Parametr kanálu je typu text spíše než relname, takže velikost písmen je ve funkci pg_notify() ponechána nedotčená. Kanály se dohromady neshodují (ERRORCHANNE !=errorchannel), takže oznámení není nikdy přijato.




  1. Použití MySql mezi klauzulí s daty

  2. arabský text se ukládá jako ???

  3. Chyba autentizačního pluginu při připojování k databázi MySQL

  4. Jak testovat tabulky spojené s cizími klíči?