2014-10-20 5 views
3

Это звучит глупо, но, пожалуйста, несите меня.Где поместить базу данных для пользователя Oracle только для чтения

У меня есть база данных Oracle, которая написана пользователем OWNER. База данных создается с помощью Liquibase, а таблицы DATABASECHANGELOG и DATABASECHANGELOGLOCK находятся в схеме OWNER. Все идет нормально.

Теперь я хотел бы создать пользователя только для чтения, ЧИТАТЕЛЬ. READER нужно читать доступ к таблице OWNER.PERSON, но ничего больше. Вот что я сделал до сих пор:

Как администратор базы данных:

create user READER identified by "password"; 
grant create session to READER; -- necessary for READER to connect to the DB 
grant create synonym to READER; -- this should be all READER needs to see 

Тогда как ВЛАДЕЛЕЦ:

grant select on PERSON to READER; 

и, наконец, в качестве кард:

create or replace synonym PERSON for OWNER.PERSON; 

Читатель может подключиться к базе данных и

SELECT firstname, lastname from PERSON; 

преуспевает.

Я хотел бы слить это. Таким образом, в owner.xml я говорю:

<changeSet author="me" id="owner_grants"> 
    <preConditions onFail="CONTINUE"> 
    <dbms type="oracle"/> 
    </preConditions> 
    <sql> 
    grant insert,select,update,delete on DATABASECHANGELOG to READER; 
    grant insert,select,update,delete on DATABASECHANGELOGLOCK to READER; 
    grant select on PERSON to READER; 
    </sql> 
    <rollback> 
    revoke insert,select,update,delete on DATABASECHANGELOG from READER; 
    revoke insert,select,update,delete on DATABASECHANGELOGLOCK from READER; 
    revoke select on PERSON from READER; 
    </rollback> 
</changeSet> 

Это работает без сучка и задоринки. Затем я добавить определения синонимов:

<changeSet author="me" id="reader_synonyms"> 
    <preConditions onFail="CONTINUE"> 
    <dbms type="oracle"/> 
    </preConditions> 
    <sql> 
    create or replace synonym PERSON for OWNER.PERSON; 
    </sql> 
    <rollback> 
    drop synonym PERSON; 
    </rollback> 
</changeSet> 

Следующая я установить --liquibaseSchemaName и --liquibaseCatalogName в вызове:

liquibase \ 
    --username=READER \ 
    --password=password \ 
    --url=jdbc:to:oracle \ 
    --defaultSchemaName=READER \ 
    --driver=com.oracle.jdbc.OracleDriver \ 
    --changeLogFile=reader.xml \ 
    --liquibaseSchemaName=OWNER \ 
    --liquibaseCatalogName=OWNER \ 
    updateSQL 

Результат удивителен: LiquiBase пытается найти таблицы в правильном схема, не замечает, что они уже есть, и пытается создать их:

SET DEFINE OFF; 

-- Create Database Lock Table 
CREATE TABLE OWNER.DATABASECHANGELOGLOCK (ID NUMBER(10) NOT NULL, LOCKED NUMBER(1) NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR2(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID)); 

-- Lock Database 
-- Create Database Change Log Table 
CREATE TABLE OWNER.DATABASECHANGELOG (ID VARCHAR2(255) NOT NULL, AUTHOR VARCHAR2(255) NOT NULL, FILENAME VARCHAR2(255) NOT NULL, DATEEXECUTED TIMESTAMP NOT NULL, ORDEREXECUTED NUMBER(10) NOT NULL, EXECTYPE VARCHAR2(10) NOT NULL, MD5SUM VARCHAR2(35), DESCRIPTION VARCHAR2(255), COMMENTS VARCHAR2(255), TAG VARCHAR2(255), LIQUIBASE VARCHAR2(20)); 

и это не удается из-за недостатка прав, потому что READER не создавать таблицы ре rmission. Но я смущен тем, почему Liquibase думает, что он должен создавать таблицы в первую очередь, потому что они есть, так как OWNER создал их. Я проверил, что таблицы действительно существуют, и READER может читать и писать им.

Что здесь происходит? Могу ли я сказать, что ликбаза «поверь мне, там есть таблицы?» Или липибаза проверяет существование без учета схемы и каталога? Я пропустил очевидную настройку?

ответ

1

Похоже на ошибку. Я создал https://liquibase.jira.com/browse/CORE-2087 с вашей информацией, и исправление будет в Liquibase 3.3.0, выпущенном на следующей неделе или около того.

+0

Отлично, спасибо за быстрое исправление. – wallenborn

+0

Я могу подтвердить, что 3.3.0 решает проблему. Еще раз спасибо. – wallenborn

+0

Хорошо. Спасибо за обновление –

Смежные вопросы