在哪里为Oracle只读用户放置databasechangelog

时间:2014-10-20 16:40:42

标签: oracle liquibase

这听起来像个愚蠢的问题,但请耐心等待。

我有一个Oracle数据库,由用户OWNER编写。数据库是使用liquibase创建的,DATABASECHANGELOG和DATABASECHANGELOGLOCK表位于OWNER模式中。到目前为止,非常好。

现在我想创建一个只读用户READER。 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

然后是OWNER:

grant select on PERSON to READER;

最后,作为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));

由于权限不足而失败,因为READER没有create table权限。但我很困惑为什么liquibase认为它必须首先创建表,因为它们在那里,因为OWNER创建了它们。我检查表确实存在,READER可以读取和写入它们。

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

1 个答案:

答案 0 :(得分:1)

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