내 문제는 예제로 설명하기 쉽습니다. 클러스터 된 응용 프로그램간에 공통 데이터를 저장하는 공용 스키마 (공용 스키마)가 있습니까?실제 chema에서 다른 스키마의 트리거 기능을 실행하십시오.
내 응용 프로그램의 모든 인스턴스에 대해 역할 (응용 프로그램 사용자로 사용)이 있습니다. 그리고 일반적인 역할은 app_users
이고 공통 스키마는 read-only
이고 모든 응용 프로그램 역할은 member
이 app_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';
과 비슷하지만 기능이 '로컬'체계와 함께 작동해야하므로 내 경우에는 트릭을 수행하지 않는다고 생각합니다.
youmg 맞아요, 잘못된 스키마에서 함수를 만들었습니다. – Strae