2012-02-13 4 views
0

내 문제는 예제로 설명하기 쉽습니다. 클러스터 된 응용 프로그램간에 공통 데이터를 저장하는 공용 스키마 (공용 스키마)가 있습니까?실제 chema에서 다른 스키마의 트리거 기능을 실행하십시오.

내 응용 프로그램의 모든 인스턴스에 대해 역할 (응용 프로그램 사용자로 사용)이 있습니다. 그리고 일반적인 역할은 app_users이고 공통 스키마는 read-only이고 모든 응용 프로그램 역할은 memberapp_users입니다.

이제 내 문제는 : 공통 스키마에서 함수 (프로 시저)를 실행하지만 app_a 테이블 (및 유일한) app_a 테이블에 영향을주는 app_a 스키마에서 트리거를 어떻게 설정합니까?

는 말은 : app_foo가 common_schema에서 update_etime() 함수에 대한 실행 권한을 가지고 액세스 할

// common_scheme, dummy function to emulate the mysql on update = now() 
CREATE OR REPLACEFUNCTION update_etime() RETURNS TRIGGER AS $$ 
    BEGIN 
    NEW.etime = date_part('epoch'::text, now())::int; 
    RETURN NEW; 
    END; 
$$ language plpgsql; 

// now, in the app_foo scheme, i have the table: 
CREATE TABLE foo_table (fid serial not null primary key unique, label char(25)); 
// and the trigger: 
CREATE TRIGGER foo_table_update_etime BEFORE UPDATE ON foo_talbe FOR EACH ROW EXECUTE PROCEDURE update_etime(); 
// ERROR: function update_etime() does not exist 
CREATE TRIGGER foo_table_update_etime BEFORE UPDATE ON foo_talbe FOR EACH ROW EXECUTE PROCEDURE common_scheme.update_etime(); 
// ERROR: function common_scheme.update_etime() does not exist 

사용자를.

아이디어가 있으십니까?

나는 봤지만 다른 스키마에서 함수를 호출하는 유일한 해결책은 execute 'select * from ' || schema_name || '.table_name';과 비슷하지만 기능이 '로컬'체계와 함께 작동해야하므로 내 경우에는 트릭을 수행하지 않는다고 생각합니다.

답변

2

구문의 두 번째 세트는 작동합니다 ...이 기능을 찾을 수없는 경우, 당신이 하나가 당신이 생각하는 것보다 다른 스키마를 작성했는지 "EXECUTE PROCEDURE common_scheme.update_etime();"

을 추측에는 요와 하나 그것이 있거나 전혀 작성하지 않은 것입니다 (예 : 구문 작성 예제에는 버그가 있고, "바꾸기"와 "함수"사이에 공백이 없어서 함수를 만들 때 오류가 발생합니다). A :..

함수가 존재하고 당신이 그것을 HTH에 생각하는 위치에 확인하기 위해 수퍼 유저로
\df *.update_etime 

+0

youmg 맞아요, 잘못된 스키마에서 함수를 만들었습니다. – Strae

관련 문제