2016-04-29 8 views
0
DECLARE 
    resources varchar[]; 
    default_active development.switch_state; 
    defaultsp varchar[]; 
    x varchar[]; 
    columnname varchar; 
    looper integer; 

BEGIN 
    -- setting resources 
    resources := array(SELECT column_name::text AS resource FROM information_schema.columns WHERE table_name='usr_defprivilegies'); 
    resources := array_remove(resources, 'id_defprvg'); 
    resources := array_remove(resources, 'id_category'); 
    resources := array_remove(resources, 'id_level'); 
    -- setting privilegies switch 
    SELECT ap.default_active AS switcher INTO default_active FROM development.usr_activeprivilegies AS ap 
INNER JOIN development.usr_managelayer AS um ON ap.id_activeprvg = um.id_activeprvg WHERE um.id_user = $1; 

    IF default_active = '1' THEN 
    looper := 1; 
    FOREACH x SLICE 1 IN ARRAY resources 
    LOOP 
     columnname := resources[looper]; 
     defaultsp := array(SELECT columnname FROM development.usr_defprivilegies AS dp WHERE dp.id_category = $4 AND dp.id_level = $3); 
     EXECUTE 'UPDATE development.usr_activeprivilegies SET default_active = ''0'', ' 
    || resources[looper] 
    || ' = ' 
    || quote_literal(defaultsp[looper]) 
    || ' WHERE id_activeprvg = ' 
    || $2; 
     looper := looper + 1; 
    END LOOP; 
    END IF; 

RETURN 1; 
END; 

配列に格納された列の値にアクセスする必要がありますが、その方法を見つけることができません。コードは正常に動作しますが、次の行が表示されます。postgres配列に格納されたQUERY行の値を取得する

quote_literal(defaultsp[looper]) 

「column_name」が返されますが、「column_value」が必要です。

お返事ありがとうございます。

答えて

0

解決策ログイン後の特権を変更するための解決策では、2つのテーブルがデフォルトでXアクティブです。デフォルトはユーザーのカテゴリとレベルに基づいたルールセットで、特権が適応可能で、postgresのinformation_schemaからリソースのソースを取得します。 forループ。

DECLARE 
    resources varchar[]; 
    resource varchar; 
    res_count integer; 
    default_active development.switch_state; 
    defaultsp development.switch_state; 
    looper integer; 

BEGIN 
    -- setting resources 
    resources := array(SELECT column_name::text AS resource FROM information_schema.columns WHERE table_name='usr_defprivilegies'); 
    resources := array_remove(resources, 'id_defprvg'); 
    resources := array_remove(resources, 'id_category'); 
    resources := array_remove(resources, 'id_level'); 
    -- setting privilegies switch 
    SELECT ap.default_active AS switcher INTO default_active FROM development.usr_activeprivilegies AS ap 
    INNER JOIN development.usr_managelayer AS um ON ap.id_activeprvg = um.id_activeprvg WHERE um.id_user = $1; 
    -- setting privilegies 
    IF default_active = '1' THEN 
    looper := 1; 
    res_count := array_length(resources, 1); 

    LOOP 
     resource := 'dp.' || resources[looper]; 
     EXECUTE 'SELECT ' 
     || resource 
     || ' FROM development.usr_defprivilegies AS dp WHERE dp.id_category = ' 
     || quote_literal($4) 
     || ' AND dp.id_level = ' 
     || quote_literal($3) INTO defaultsp; 

     EXECUTE 'UPDATE development.usr_activeprivilegies SET ' 
     || resources[looper] 
     || ' = ' 
     || quote_literal(defaultsp) 
     || ' WHERE id_activeprvg = ' 
     || $2; 

     looper := looper + 1; 
     EXIT WHEN looper > res_count; 
    END LOOP; 

    EXECUTE 'UPDATE development.usr_activeprivilegies SET updateby = ' 
     || quote_literal($1) 
     || ', updatedate = CURRENT_TIMESTAMP, default_active = ' 
     || quote_literal(0); 
    END IF; 

RETURN 1; 
END; 

これは正常です。

関連する問題