이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 메이저 토토 사이트버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

알림

이름

NOTIFY -- 알림 생성

시놉시스

알림채널 [ , 페이로드 ]

설명

알림명령은 다음을 보냅니다. 선택 사항과 함께 알림 이벤트"페이로드"문자열을 각 클라이언트 응용프로그램에 이전에 실행됨듣기채널지정된 채널 이름에 대해 현재 데이터베이스에 있습니다.

알림간단한 상호 프로세스 제공 액세스하는 프로세스 모음을 위한 통신 메커니즘 같은포스트그레SQL데이터베이스. 에이 페이로드 문자열은 알림과 함께 전송될 수 있습니다. 구조화된 데이터를 전달하기 위한 더 높은 수준의 메커니즘을 구축할 수 있습니다. 데이터베이스의 테이블을 사용하여 추가 데이터를 전달합니다. 청취자에게 알리는 사람입니다.

알림 이벤트를 위해 클라이언트에 전달된 정보 알림 채널 이름, 알림 세션의 이름이 포함됩니다. 서버 프로세스PID, 그리고 페이로드 문자열(페이로드 문자열이 없으면 빈 문자열임) 지정되었습니다.

채널 이름을 정의하는 것은 데이터베이스 디자이너의 몫입니다 이는 특정 데이터베이스에서 사용될 것이며 각각의 의미입니다. 일반적으로 채널 이름은 일부 테이블의 이름과 동일합니다. 데이터베이스에서 알림 이벤트는 본질적으로 다음을 의미합니다."나는 이 테이블을 변경했습니다. 한번 살펴보세요 새로운 소식을 확인하세요.". 그러나 그러한 협회는 다음과 같이 시행되지 않습니다.알림그리고듣기명령. 예를 들어, 데이터베이스 디자이너 여러 다른 채널 이름을 사용하여 서로 다른 신호를 보낼 수 있습니다. 단일 테이블에 대한 일종의 변경 사항입니다. 또는 페이로드 문자열을 사용하여 다양한 경우를 구별할 수 있습니다.

언제알림신호를 보내는 데 사용됩니다. 특정 테이블에 대한 변경 발생, 유용한 프로그래밍 기술은 다음을 넣는 것입니다.알림규칙에서 이는 테이블 업데이트에 의해 트리거됩니다. 이로써 알림 테이블이 변경되면 자동으로 발생하며 애플리케이션 프로그래머는 실수로 이를 잊어버릴 수 없습니다.

알림SQL과 상호작용 몇 가지 중요한 방식으로 거래합니다. 첫째, 만일 a알림트랜잭션 내에서 실행되며, 알림 이벤트는 거래가 완료될 때까지 전달되지 않습니다. 헌신적이다. 거래가 다음과 같으므로 이는 적절합니다. 중단되었습니다. 포함된 모든 명령은 효과가 없습니다.알림. 하지만 다음과 같은 경우 당황스러울 수 있습니다. 하나는 알림 이벤트가 전달될 것으로 예상됩니다. 즉시. 둘째, 청취 세션이 거래가 진행되는 동안 알림 신호 알림 이벤트는 연결된 클라이언트로 전달되지 않습니다. 트랜잭션이 완료된 직후까지(커밋되거나 또는 중단됨). 다시 말하지만, 알림이 다음과 같은 경우에는 추론이 가능합니다. 나중에 중단된 트랜잭션 내에서 전달된 경우 어떻게든 알림을 취소하고 싶지만 서버는 할 수 없다"철회"알림 한 번 클라이언트에게 보냈습니다. 따라서 알림 이벤트는 거래 간에 전달됩니다. 이것의 결론은 이러하다. 사용하는 애플리케이션알림실시간용 신호는 거래를 짧게 유지하도록 노력해야 합니다.

동일한 채널 이름이 여러 번 신호를 받는 경우 동일한 페이로드 문자열을 가진 동일한 트랜잭션, 데이터베이스 서버는 단일 알림만 전달하기로 결정할 수 있습니다. 에 반면, 고유한 페이로드 문자열이 있는 알림은 항상 별개의 알림으로 전달됩니다. 마찬가지로, 다른 거래의 알림은 절대로 접히지 않습니다. 하나의 알림으로. 나중에 인스턴스를 삭제하는 것을 제외하고 중복 알림,알림동일한 거래의 알림이 수신되도록 보장합니다. 보낸 순서대로 배달되었습니다. 또한 다양한 트랜잭션의 메시지가 순서대로 전달됩니다. 트랜잭션이 커밋되었습니다.

실행하는 클라이언트에 일반적입니다알림동일한 알림을 듣고 있습니다 채널 자체. 이 경우 알림이 다시 전송됩니다. 이벤트는 다른 모든 청취 세션과 마찬가지로 에 따라 애플리케이션 로직으로 인해 쓸모없는 작업이 발생할 수 있습니다. 예를 들어 데이터베이스 테이블을 읽어서 동일한 업데이트를 찾습니다. 그 세션이 방금 작성되었습니다. 이런 추가 피해는 가능해요 알림 세션의 서버 프로세스 여부를 확인하여 작업PID(다음에서 제공됨) 알림 이벤트 메시지)는 자신의 세션과 동일PID(다음에서 사용 가능libpq). 그들이 동일할 때, 알림 이벤트는 자신의 작업이 다시 반송되는 것이며 무시당해라.

매개변수

채널

신호를 받을 알림 채널의 이름(모든 식별자).

페이로드

"페이로드"문자열 알림과 함께 전달되었습니다. 이것은 단순 문자열 리터럴로 지정됩니다. 기본적으로 구성에서는 8000바이트보다 짧아야 합니다. (만약 바이너리 데이터나 많은 양의 정보가 필요합니다. 전달되면 데이터베이스 테이블에 저장하는 것이 가장 좋습니다. 레코드의 키를 보냅니다.)

참고

보낸 알림을 보관하는 대기열이 있습니다. 하지만 아직 모든 청취 세션에서 처리되지는 않았습니다. 만약 이 대기열 가득 차서 트랜잭션 호출알림커밋 시 실패합니다. 대기열이 꽤 있어요 크기가 크며(표준 설치 시 8GB) 충분해야 합니다. 거의 모든 사용 사례에 적합한 크기입니다. 그러나 정리 작업은 수행할 수 없습니다. 세션이 실행되면 배치듣기그리고 그런 다음 매우 오랜 시간 동안 거래를 시작합니다. 일단 큐는 절반 정도 차면 로그 파일에 다음을 가리키는 경고가 표시됩니다. 정리를 방해하는 세션입니다. 이 경우에는 다음을 수행해야 합니다. 이 세션이 현재 트랜잭션을 종료하는지 확인하십시오. 정리가 진행될 수 있습니다.

실행된 트랜잭션알림2단계를 준비할 수 없습니다. 커밋합니다.

pg_와이즈 토토

알림을 보내려면 다음 기능을 사용할 수도 있습니다.pg_와이즈 토토(텍스트, 텍스트). 이 함수는 채널 이름을 첫 번째 인수로, 페이로드를 두 번째. 이 함수는보다 사용하기가 훨씬 쉽습니다.알림작업이 필요한 경우 명령 상수가 아닌 채널 이름 및 페이로드.

다음에서 수신/알림 시퀀스 구성 및 실행psql:

가상 듣기;
가상으로 알림;
PID 8448을 사용하는 서버 프로세스로부터 비동기 알림 "가상"이 수신되었습니다.
NOTIFY virtual, '이것이 페이로드입니다';
PID 8448을 사용하는 서버 프로세스에서 수신된 페이로드 "이것은 페이로드입니다"가 포함된 비동기 알림 "가상"입니다.

들어봐 foo;
SELECT pg_와이즈 토토('fo' || 'o', '지불' || '로드');
PID 14728을 사용하는 서버 프로세스에서 수신된 페이로드 'payload'가 포함된 비동기 알림 'foo'.

호환성

없습니다알림문의 SQL 표준.