---
title: Oracle 模式下使用 create or replace 创建对象后对象上的权限会丢失-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 Oracle 模式下使用 create or replace 创建对象后对象上的权限会丢失相关的常见问题和使用技巧，帮助您快速解决 Oracle 模式下使用 create or replace 创建对象后对象上的权限会丢失的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# Oracle 模式下使用 create or replace 创建对象后对象上的权限会丢失

更新时间：2023-12-07 03:16

适用版本： V2.2.x、V3.1.x、V3.2.x 内容类型：Troubleshoot  

create or replace 创建视图后，视图上原来的对象权限丢失。

示例如下：

1. mltest 用户下创建测试表 test，并创建视图 test_v。

      1. 创建测试表 test。

        ```shell
        obclient> CREATE TABLE test(id int,name1 varchar2(100),name2 varchar2(100),name3 varchar2(100),name4 varchar2(100));

        ```
      2. 往测试表 test 内插入数据。

        ```shell
        obclient> INSERT INTO test VALUES(1,'name1','name2','name3','name4');

        ```
      3. 保存数据。

        ```shell
        obclient> commit;

        ```
      4. 查询测试表 test 的数据是否插入成功。

        ```shell
        obclient> SELECT * FROM test;

        ```

        返回结果如下：

        ```shell
        +------+-------+-------+-------+-------+
        | ID   | NAME1 | NAME2 | NAME3 | NAME4 |
        +------+-------+-------+-------+-------+
        |    1 | name1 | name2 | name3 | name4 |
        +------+-------+-------+-------+-------+
        1 row in set (0.00 sec)

        ```
      5. 创建视图 test_v。

        ```shell
        obclient> create or replace view test_v as select id,name1 from test;

        ```
      6. 查询视图 test_v 是否创建成功。

        ```shell
        obclient> SELECT * FROM test_v;

        ```

        返回结果如下：

        ```shell
        +------+-------+
        | ID   | NAME1 |
        +------+-------+
        |    1 | name1 |
        +------+-------+
        1 row in set (0.00 sec)

        ```
 2. sys 用户下给 mltest2 用户授予查询视图 mltest.test_v 的权限。

      1. 查询视图 TEST_V 授权情况。

        ```shell
        obclient> SELECT * FROM dba_tab_privs WHERE table_name='TEST_V';

        ```
      2. 授予 mltest2 用户查询视图 mltest.test_v 的权限。

        ```shell
        obclient> grant select on mltest.test_v to mltest2;

        ```
      3. 查询授权是否成功。

        ```

        返回结果如下：

        ```shell
        +---------+--------+------------+---------+-----------+-----------+-----------+
        | GRANTEE | OWNER  | TABLE_NAME | GRANTOR | PRIVILEGE | GRANTABLE | HIERARCHY |
        +---------+--------+------------+---------+-----------+-----------+-----------+
        | MLTEST2 | MLTEST | TEST_V     | MLTEST  | SELECT    | NO        | NO        |
        +---------+--------+------------+---------+-----------+-----------+-----------+
        1 row in set (0.00 sec)

        ```
 3. mltest2 用户下查询 mltest.test_v。

   ```shell
   obclient> SELECT * FROM mltest.test_v;

   ```

   返回结果如下：

   ```
 4. mltest 用户下重新创建 test_v 视图。

   ```
 5. 登录 mltest2 用户，查看 mltest.test_v。

   ```

   返回结果如下：

   ```shell
   ORA-00942: table or view does not exist

   ```
 6. 登录 sys 用户查看 mltest2 用户对视图 mltest.test_v 的对象权限。

   ```

   返回结果如下：

   ```shell
   Empty set (0.00 sec)

   ```

## 适用版本

OceanBase 数据库 V2.1.x、V2.2.x、V3.1.x、V3.2.x 版本。

## 问题原因

create or replace 的实现是 DROP 旧对象再 CREATE 新对象，新创建的对象没有维护对象权限，view、routine、sequence 等同时支持对象权限和 create or replace 语法的对象都有此类问题。

## 解决方式

- 重新授予对象权限。
 - 升级 OceanBase 数据库至 V2.2.77 BP15、V3.2.3 BP6、V3.1.2 BP11、V3.2.4、V4.0.0 BP1 及以上版本。

上一篇

[Oracle 模式重新创建对象导致对象上的权限丢失](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000207740)

下一篇

[information_schema.COLUMNS 表查询结果重复](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000259822) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
