2016-09-01 2 views
0

전단 및 CartoDB를 사용하여 웹 응용 프로그램을 만들려고합니다. this tutorial을 사용하여 공용 CartoDB 테이블에 데이터를 읽고 쓰려고합니다.Leaflet.draw 및 CartoDB로 테이블을 업데이트/삽입하는 방법

자습서에서는 보안 정의자를 사용하여이를 수행하는 방법을 설명합니다. 어떤 이유로 든 응용 프로그램에서 leaflet.draw를 사용하여 만든 기능이 내 테이블에 삽입되지 않습니다. 나는 코딩에 익숙하지 않고 SQL 쿼리가 실제로 내 코드에서 호출되는 방법을 잘 모르고 있지만 예제 소스 코드를 복제하려고 시도했지만 실행과 관련한 행운을 얻지 못했습니다.

목표는 사용자가지도에서 포인트를 만들고 편집하고 CartoDB의 crowdsource 데이터베이스에 저장하도록 허용하는 것입니다.

내 프로젝트에 대한 코드는 여기에서 볼 수 있습니다 : https://github.com/zrobby/crowdsource-storymap

나는 다음과 같다 실행 어려움을 겪고 위 링크 된 튜토리얼 제공하고있어 특정 SQL 쿼리.

DROP FUNCTION IF EXISTS leaflet_upsert_usercomments(int[], text[]); 

    -- Returns a set of op,cartodb_id values where op means: 
    -- deleted: -1 
    -- updated: 0 
    -- inserted: 1 

    CREATE OR REPLACE FUNCTION leaflet_upsert_usercomments(
    cartodb_ids integer[], 
    geojsons text[]) 
    RETURNS TABLE(op int, cartodb_id int) 

    LANGUAGE plpgsql SECURITY DEFINER 
    RETURNS NULL ON NULL INPUT 
    AS $$ 
    DECLARE 
    sql text; 
    BEGIN 

    sql := 'WITH n(cartodb_id,the_geom) AS (VALUES '; 

    -- Iterate over the values 
    FOR i in 1 .. array_upper(geojsons, 1) 
    LOOP 
    IF i > 1 THEN sql := sql || ','; END IF; 
    sql :=sql || '('||cartodb_ids[i]||',' 
      || 'ST_SetSRID(ST_GeomFromGeoJSON(NULLIF('''|| geojsons[i] ||''','''')),4326))'; 
    END LOOP; 

    sql := sql || '), do_update AS (' 
     || 'UPDATE leaflet_data p ' 
     || 'SET the_geom=n.the_geom FROM n WHERE p.cartodb_id = n.cartodb_id ' 
     || 'AND n.the_geom IS NOT NULL ' 
     || 'RETURNING p.cartodb_id), do_delete AS (' 
     || 'DELETE FROM leaflet_data p WHERE p.cartodb_id IN (' 
     || 'SELECT n.cartodb_id FROM n WHERE cartodb_id >= 0 AND ' 
     || ' n.the_geom IS NULL) RETURNING p.cartodb_id), do_insert AS (' 
     || 'INSERT INTO leaflet_data (the_geom)' 
     || 'SELECT n.the_geom FROM n WHERE n.cartodb_id < 0 AND ' 
     || ' n.the_geom IS NOT NULL RETURNING cartodb_id) ' 
     || 'SELECT 0,cartodb_id FROM do_update UNION ALL ' 
     || 'SELECT 1,cartodb_id FROM do_insert UNION ALL ' 
     || 'SELECT -1,cartodb_id FROM do_delete'; 

    RAISE DEBUG '%', sql; 

    RETURN QUERY EXECUTE sql; 

    END; 
    $$; 

    -- Grant access to the public user 
    GRANT EXECUTE ON FUNCTION leaflet_upsert_usercomments(integer[],text[]) TO publicuser; 
+1

관련 질문 : http://gis.stackexchange.com/questions/134544/in-cartodb-best-way-to-have- 복수 참여자와 함께 테이블 – zrobby

+1

관련 솔루션 : https://github.com/radumas/crowdmap-basic – zrobby

답변

0

이전 답변은 너무 익숙하지 않았으므로 곧 비추 게 될 것입니다.

올바른 방법은 함수의 소유자 권한으로 INSERT 쿼리를 실행하는 SECURITY DEFINER 함수를 설정하는 것입니다.

여기를 확인 ->https://gist.github.com/ernesmb/beb25f539f8ff38bbd891e6d114ea7f4

는 희망이 도움이!

+0

완벽하게 작동합니다! 고맙습니다!! – zrobby

0

사용중인 테이블 (또는 열)에 특정 권한을 부여, 대신 복잡한 보안 정의 자 기능을 만드는 쉬운 방법이있을 수 있습니다. http://bl.ocks.org/iriberri/7d84ed35ef0b5e80555d

프론트 엔드 응용 프로그램의 일부입니다 만 포인트를 추가하려고으로

, 당신은이 예에서 사용하기에 무엇이 같은 것을 사용할 수 있습니다. 테이블에 적절한 권한을 부여하려면 CARTO 편집기의 SQL 패널에서 또는 SQL API를 통해 다음 SQL을 실행해야합니다. 경우

GRANT INSERT (column1, column2, ...) ON tableName TO publicuser; 

GRANT USAGE ON SEQUENCE tableName_cartodb_id_seq_0 TO publicuser; 

는 개발 도구의 네트워크 탭에서 디버깅 할 수, 오류가의 SQL 호출은 에러의 설명을 반환합니다.

권한을 부여한 후에는 호출을 인증하지 않고 프론트 엔드에서 INSERT 쿼리를 실행할 수 있어야합니다. 위험을 염두에 두시기 바랍니다.

+0

Ernesto, 답장을 보내 주셔서 감사합니다! 보안 정의 자에 대한 대체 접근 방식을 고려하지 않았지만 내 응용 프로그램의 단순성에 대해 사용자의 방식이 의미가 있습니다.나는 곧 후속 조치를 취할 것이다. – zrobby