私は最近、このようなことをしました (アプリケーションに「キャンセル」ボタンを追加しました)。私が一緒にハッキングした plpgsql 関数を以下に示します。これは基本的にpg_cancel_backend()
関数のラッパーです。
警告:
1)。アプリケーションは一意の ID (または UUID) を作成し、それを「p_uid」パラメーターとして関数に渡す必要があります。
2)。アプリケーション ユーザーをハードコーディングしました (変更されません)。
3)。Postgresql 9.0+ (これは 9.2 用に作成されたもので、それ以前のバージョンではテストされていません)
4)。関数のセキュリティを少し強化することができます。
CREATE OR REPLACE FUNCTION public.cancel_user_query(p_uid TEXT, OUT retval BOOLEAN) RETURNS boolean
AS $function$
DECLARE
BEGIN
/* The pg_sleep() call at the start is because if a user issues a query
then promptly tries to kill it, it will likely not have shown up in the
pg_stat_activity view yet (there is a delay before it appears).
XXX: The GUC setting "track_activities" *MUST* be enabled for this to work.
*/
retval := FALSE;
IF ( current_setting('track_activities')::BOOLEAN IS NOT TRUE ) THEN
RAISE WARNING '[PUBLIC.CANCEL_USER_QUERY] - "track_activities" *MUST* be enabled for this to work';
RETURN;
END IF;
/* In a system under regular high load, this might need to be bumped higher than 2 seconds */
PERFORM pg_sleep(2);
WITH q AS ( SELECT pid FROM pg_stat_activity WHERE LOWER(usename) = 'YOUR_APP_USER' AND application_name = p_uid AND state <> 'idle' )
SELECT pg_cancel_backend(pid) AS retval
INTO retval
FROM q;
if ( retval IS NOT TRUE ) then
retval := FALSE;
end if;
RETURN;
EXCEPTION
WHEN others THEN
RAISE WARNING '[PUBLIC.CANCEL_USER_QUERY] - ERROR: %',sqlerrm;
retval := FALSE;
RETURN;
END;
$function$ LANGUAGE plpgsql SECURITY DEFINER;
[クエリのキャンセル] ボタンをクリックすると、アプリケーションは関数を実行し、返されたステータスを確認します。例えば。SELECT retval FROM public.cancel_user_query('asifdaqiwaviafasdf') retval