2012-05-11 4 views
4

저는 오랫동안 MySQL을 사용해 왔으며 Postgres를 배우기로 결정했습니다. 전환은 끔찍한 일이 아니지만 오늘은 걸림돌로 치닫습니다 :Postgres 사용자가 다른 데이터를 참조하십시오.

관리자 계정 postgres과이 애플리케이션 전용 사용자 tv이 있습니다. 편의를 위해 admin 계정 아래 테이블의 일부 행을 수정했습니다. 웹 사이트는 내가 데이터베이스에서 변경 한 내용을 반영하지 않습니다.

약 한 시간 내 다양한 ​​캐싱 전략을 비난 한 후 드디어 tv 사용자로 psql를 실행하고 거기에서 행의 어떤 것도 만들어 동안이 postgres로 로그인 한 변경을 반영하지 것으로 나타났습니다. MySQL 배경에서 볼 때,이 동작은 나에게 완전히 좌절 스러웠습니다.

짧은 이야기 :이 기능입니까, 아니면 내가 어딘가 잘못 설정 했습니까? 그리고 데이터베이스를 이렇게 만들지 못하게 할 방법이 있습니까?

도움 주셔서 감사합니다. 업데이트


: 여기 명령의 샘플링은 다음과 같습니다

 
[12:23:04] blake$ sudo -u postgres psql -d teevee 
psql (9.1.3) 
Type "help" for help. 

teevee=# SELECT COUNT(*) FROM episode; 
count 
------- 
    1 
(1 row) 
 
[12:23:25] blake$ psql -U tv -d teevee -h localhost -W 
Password for user tv: 
psql (9.1.3) 
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) 
Type "help" for help. 

teevee=> SELECT COUNT(*) FROM episode; 
count 
------- 
    176 
(1 row) 
+2

설명이 거의 불가능한 것처럼 보입니다. 동일한 데이터베이스의 행을 변경 하시겠습니까? 그런 경우의 99 %에서 잘못된 연결로 판명됩니다. psql은 사용자가 다른 이름을 지정하지 않는 한 사용자의 이름이 지정된 데이터베이스를 기본값으로 사용합니다. postgres 사용자와 tv 사용자로 psql을 시작하기 위해 사용했던 ** 정확한 ** 명령 줄을 보여주십시오. –

+0

migth는 올바른 데이터베이스를 사용하고 있는지 확인하기 위해 두 사용자가 연결되었을 때'select current_database();'를 실행하기를 원합니다. –

+0

변경 사항이 여전히 postgres 사용자에게 표시됩니까? –

답변

4

당신은 psql에서 \dn 또는 \dn+를 사용하여 스키마를 나열 할 수 있습니다,하지만 난 더 나은 시각적 표현을 가지고 pgAdmin와 같은 도구를 사용하는 것이 좋습니다 것입니다 . \dt public.*\dt tv.*을 사용하여 잠재적 인 tvpublic 스키마에 충돌하는 테이블이 있는지 확인할 수 있습니다.

복수형 schemas을 사용하는 것이 유용 할 수 있지만 종종 필요하지 않습니다.

기본 검색 경로는 "$user",public 인 경향이 있습니다. 즉, 사용자 이름이 지정된 스키마에서 먼저 테이블을 사용하고 가장 일반적인 스키마 (public)로 되돌아갑니다.

그렇지 않으면 좋은 이유가없는 한 일반적으로 public 스키마를 사용하는 것이 좋습니다. 이것은 일반적으로 기본값이어야합니다. (왜 다른 스키마가 있었는지 잘 모르겠다.)

테이블 스키마 using ALTER TABLE xxxxxx SET SCHEMA yyyyyyy을 변경할 수 있지만, 충돌하는 이름으로 다른 테이블을 삭제해야 할 수도 있습니다. 데이터를 먼저 복사하는 것이 좋습니다.

INSERT INTO public.episode SELECT * FROM tv.episode과 같은 것이 지정된 열 이름을 사용하면 더 잘 작동합니다. 이 작동 여부는 다른 제약 조건에 따라 달라질 수 있습니다.

public 스키마에 아무 것도 유용하지 않은 경우 스키마를 완전히 삭제하고 (DROP SCHEMA public) 다른 하나의 이름을 (ALTER SCHEMA tv RENAME to public)로 바꿀 수 있습니다. 이미 부여 된 내용에 따라 다음과 같은 내용이 필요할 수도 있습니다.

GRANT ALL ON SCHEMA public TO postgres; 
GRANT ALL ON SCHEMA public TO public; 
+1

MySQL에서 아마도 추가 스키마를 생성 한 hacky little import 스크립트가있었습니다. Drop, alter 및 grant 시퀀스는 아름답게 작동했습니다. – Blake

관련 문제