2015-11-02 43 views
0

我正在寫一個函數,如果當前用戶已經對某一行進行了「加星標」操作,就會得到該函數。當前用戶的ID存儲在本地變量中,可通過postgresql函數訪問。如何爲current_setting提供默認值?這裏是我的功能:如何檢測current_setting是否爲

CREATE FUNCTION current_user_starred(star_group_id integer) 
    RETURNS boolean 
    AS $$ 
    SELECT COUNT(*) != 0 
     FROM star 
    WHERE star_group_id = star_group_id 
     AND starrer_id = current_setting('user_id')::integer; 
    $$ 
    LANGUAGE sql; 

current_setting('user_id')默認設置我想用-1或0。

+0

使用像myapp.user_id這樣的點限定參數,並使用alter user ... set ....或alter database ... set ...來設置默認值。 –

回答

2

基本上,@Craig評論:設置爲customized option角色或數據庫:

ALTER ROLE SET foo.user_id = '-1'; 

或者:

ALTER DATABASE SET foo.user_id = '-1'; 

或添加設置postgresql.conf(整個DB集羣),並重新加載。

否則,如果參數尚未設置,您可以觸發異常,但:

ERROR: unrecognized configuration parameter "foo.user_id" 
SQL state: 42704 

你還需要一個工作的功能。你呈現的內容被打破了。

CREATE FUNCTION current_user_starred(_star_group_id integer) 
    RETURNS boolean AS 
$func$ 
SELECT EXISTS (
    SELECT 1 
    FROM star s, (SELECT current_setting('foo.user_id') AS _user_id) x 
    WHERE s.star_group_id = _star_group_id 
    AND s.starrer_id = CASE x._user_id WHEN '' THEN -1 ELSE x._user_id::integer END 
    ); 
$func$ LANGUAGE sql; 
  • 避免表列排位賽和/或使用不衝突的參數名稱命名衝突。我做了兩個。

  • 使用CASE語句默認爲-1,或者當參數已被重置爲''(空字符串)時使用。

  • EXISTS可以比COUNT(*) != 0供您使用便宜得多。

  • 我在FROM列表中的一個很小的子查詢中檢索參數值。簡化CASE聲明。