2017-03-06 8 views
-1

나는 이것을 처음부터 어디서부터 시작해야할지 모르겠습니다.Postgres에서 삭제 된 트리거 - 여전히 어딘가에서 실행하려고합니다. 포스트그레스에서 실패한 것으로 나타남 로그

나는 postgres 데이터베이스를 가지고 있습니다.

--trigger function to populate spm storage table 
CREATE OR REPLACE FUNCTION mid3_spm() RETURNS TRIGGER AS 
$BODY$ 
BEGIN 
    insert into machines_spm_storage (SELECT * FROM machineid3_spm_step4); 
END; 
$BODY$ 
language plpgsql; 


--trigger to initiate function 
CREATE TRIGGER trigger_mid3_spm 
    AFTER UPDATE ON machines_machineevent 
    FOR EACH ROW 
    EXECUTE PROCEDURE mid3_spm(); 

트리거의 목표는 뷰에서 데이터를 끌어와 그것을 저장하는 것입니다 : 내가 방아쇠를 만들려면 다음 스크립트를 사용

CREATE OR REPLACE FUNCTION mid1_spm() 
    RETURNS trigger AS 
$BODY$ 
BEGIN 
    insert into machines_spm_storage (SELECT * FROM machineid1_spm_step4); 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION mid1_spm() 
    OWNER TO postgres; 

-이 하나 같이 세 가지 기능을 생성 machines_spm_storage 테이블에 있습니다.

처음 테스트 트리거를 만들 때 테이블 이름은 machine_5_spm_storage입니다. 지금은 (포스트 그레스 로그)이 오류 나는이 테이블을 삭제 한

2017-03-06 14:05:01 EST [9468-1] [email protected]_ar_db ERROR: relation "machine_5_spm_storage" does not exist at character 13 
2017-03-06 14:05:01 EST [9468-2] [email protected]_ar_db STATEMENT: INSERT INTO machine_5_spm_storage (SELECT * FROM machine_5_spm_step4); 

가 계속, 모든 트리거를 삭제 포스트 그레스 서비스를 다시 시작 감소하고 데이터베이스를 다시 작성. 왜 원래의 트리거를 계속 실행하려고하는지 (또는 심지어 어떻게) 모르겠다.

나는 내가 가진 것을 미세하게 조정하기 위해 원본을 삭제했습니다. 테이블 이름을 변경하면 오류가 발생한 테이블에 데이터를 삽입하려고합니다. 문제가 사라지고 트리거가 올바르게 작동합니다. 그러나 스크립트에는 오래된 테이블을 참조하는 것도 없습니다.

모든 도움이나 의견을 보내 주시면 감사하겠습니다.

P. 나는 트리거가 그 자체로 작동한다는 것을 안다 - 나의 문제는 더 이상 존재하지 않는 테이블을 계속 참조하는 것 같다. 그리고 새로운 기능을 만들었다는 사실을 인식하지 못합니다 - 동일한 기능 - 방금 이름을 변경했습니다).

UPDATE : 여기 트리거와 기능의 최신 버전은 모습입니다 같은 :

기능 :

-- Function: mid1_spm() 

-- DROP FUNCTION mid1_spm(); 

CREATE OR REPLACE FUNCTION mid1_spm() 
    RETURNS trigger AS 
$BODY$ 
BEGIN 
    insert into machines_spm_storage (SELECT * FROM machineid1_spm_step4); 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION mid1_spm() 
    OWNER TO postgres; 

트리거 : 유일한 차이점은 정말 이름이

CREATE TRIGGER trigger_mid2_spm 
    AFTER UPDATE 
    ON machines_machineevent 
    FOR EACH ROW 
    EXECUTE PROCEDURE mid2_spm(); 

입니다 보기와 테이블의 이름. 하지만 원래 테스트 버전을 완전히 삭제했습니다. postgres의 로그

오늘은 다음과 같습니다

2017-03-07 10:45:01 EST [12069-1] [email protected]_ar_db ERROR: relation "machine_5_spm_storage" does not exist at character 13 
2017-03-07 10:45:01 EST [12069-2] [email protected]_ar_db STATEMENT: INSERT INTO machine_5_spm_storage (SELECT * FROM machine_5_spm_step4); 
2017-03-07 10:50:01 EST [12210-1] [email protected]_ar_db ERROR: relation "machine_5_spm_storage" does not exist at character 13 
2017-03-07 10:50:01 EST [12210-2] [email protected]_ar_db STATEMENT: INSERT INTO machine_5_spm_storage (SELECT * FROM machine_5_spm_step4); 
2017-03-07 10:55:02 EST [12434-1] [email protected]_ar_db ERROR: relation "machine_5_spm_storage" does not exist at character 13 
2017-03-07 10:55:02 EST [12434-2] [email protected]_ar_db STATEMENT: INSERT INTO machine_5_spm_storage (SELECT * FROM machine_5_spm_step4); 
2017-03-07 11:00:01 EST [12759-1] [email protected]_ar_db ERROR: relation "machine_5_spm_storage" does not exist at character 13 
2017-03-07 11:00:01 EST [12759-2] [email protected]_ar_db STATEMENT: INSERT INTO machine_5_spm_storage (SELECT * FROM machine_5_spm_step4); 

트리거를 실행하려고하지만 (어떻게 든)는 뷰 및 테이블의 원래 이름을 참조 있기 때문에 실패하는 것 - 그것은 그런 식으로 작성하지 비록 . 나는 이것에 대한 완전한 손실에있어.

업데이트 날짜 : 3/7/17 - 내가 만든 모든 트리거를 삭제했습니다. 그리고 그 스크립트는 여전히 어떻게 든 실행하려고합니다. 그래서 이것은 처음 깨달은 것보다 다른 문제라고 생각합니다. 트리거가 없거나 기능이없고 실행중인 작업이 없더라도 스크립트는 여전히 실패하고 로그에 표시됩니다.

+0

아마도 pgadmin을 사용하는 경우 트리를 새로 고침해야합니다. 또한 이것을 확인하십시오. http://stackoverflow.com/a/25204845/3470178 –

+0

@JuanCarlosOropeza 이봐! :) 나는 나무, 심지어 개별 트리거와 테이블을 새로 고쳤다. Postgres 서비스를 다시 시작했습니다. 나는 그것이 존재하지 않는 테이블을 위해 어떻게 동작하는지조차 모르겠습니다. 난 그냥 오늘 아침에 다시 로그를 확인하고 여전히 트리거를 실행하려고하지만 그것은 원래의 테이블 이름으로 (그리고 심지어 존재하지 않는) 그것을 실행하려고합니다. 그것은 내가 찾을 수있는 방법으로 쓰여지지 않았습니다. – Nicoale

+0

@JuanCarlosOropeza - 뭔가 흥미로운 것으로 나타났습니다. 모든 기능과 트리거를 삭제했습니다. 그 스크립트는 여전히 실행하려고합니다. 모든 항목이 삭제 된 후에도 로그 파일에 계속 표시됩니다. 그래서 다른 기본 스크립트가 실행되고 있는데, 어디서부터 ... – Nicoale

답변

1

데이터베이스를 삭제할 수 없으며 깨끗한 스키마로 시작할 수 없었습니다. 그러나 데이터를 삭제하고 원본 데이터를 복원하여 실행중인 데이터를 재설정하려고 시도했을 때 port 5432 already in use 오류가 발생했습니다.

정확하게 설명하는 방법이 명확하지 않지만 마치 데이터베이스가 두 번 실행되는 것과 같습니다. 데이터베이스를 삭제하고 pgadmin을 다시 시작한 후 데이터베이스가 있었지만 이전 버전이었습니다. 최신 데이터로 다시 복원되었으므로 백그라운드에서 실행되는 "고스트 트리거"가 더 이상 없습니다.