2014-10-20 33 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; 

现在READER可以连接数据库和

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)); 

和失败,因为权限不足,因为读者不具有创建表的PE rmission。但我很困惑,为什么liquibase认为它必须首先创建表格,因为它们在那里,因为OWNER创建了它们。我检查表确实存在,并且READER可以读取和写入它们。

这是怎么回事?我可以告诉liquibase“相信我,桌子在那里吗?”或者liquibase检查是否存在,而不考虑模式和目录?我错过了一个明显的设置?

回答

1

它看起来像一个错误。我用你的信息创建了https://liquibase.jira.com/browse/CORE-2087,修复将在下周左右发布的Liquibase 3.3.0中。

+0

太好了,谢谢你的快速解决。 – wallenborn 2014-10-24 07:16:29

+0

我可以确认3.3.0解决了这个问题。再次感谢。 – wallenborn 2014-11-12 15:25:17

+0

好。感谢更新 – 2014-11-12 15:59:03