创建触发器报PL/SQL: ORA-00942: 表或视图不存在

创建触发器报PL/SQL: ORA-00942: 表或视图不存在,现在如下验证进行重现:

1.创建用户u1赋予dba权限

SQL> create user u1 identified by u1;

用户已创建。

SQL> grant dba to u1;

授权成功。

2.创建用户u2并赋予dba权限
SQL> create user u2 identified by u2;
用户已创建。
SQL> grant dba to u2;

授权成功。

3.在用户u1下创建表tab1
SQL> conn u1/u1
已连接。
SQL> connect u1/u1
已连接。
SQL> create table tab1
  2  (
  3     col1 number,
  4     col2 number
  5  );
表已创建。
SQL>
4.登录到用户u2
C:\Users\Administrator>sqlplus u2/u2
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 11月 4 09:15:38 2014
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
在u2下访问u1的tab1可以访问的(因为u2具有dba权限)
SQL> select * from u1.tab1;
未选定行
5.在u2下创建触发器
SQL> create or replace trigger trg1
  2  before insert or update on u1.tab1
  3  for each row
  4  begin
  5    :new.col2 := :new.col1*2;
  6  insert into u1.tab1 values (1,1);
  7  commit;
  8  end;
  9  /
警告: 创建的触发器带有编译错误。
SQL> show error
TRIGGER TRG1 出现错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/1      PL/SQL: SQL Statement ignored
3/16     PL/SQL: ORA-00942: 表或视图不存在
SQL>

报错报表不存在,疑问表是存在并且是可以访问的


最终定位原因是在触发器中要显式的赋予对表的访问权限
现在把表tab1的select,update ,insert显式赋予用户u2

SQL> show user
USER 为 "U1"
SQL> grant select,update,insert on u1.tab1 to u2;
授权成功。
SQL>
重新编译触发,没有错误编译通过
SQL> show user
USER 为 "U2"
SQL> alter trigger trg1 compile;
触发器已更改
SQL> show error
没有错误。
SQL>
PL/SQL 中文显示不全的问题通常出现在使用 Oracle 数据库并使用特定的字符集编码时。这可能是由于数据库连接设置、空间字符集或者是查询结果的处理方式导致的。 ### 解决步骤: #### 1. 检查数据库连接字符集 确保你的数据库连接已经配置了合适的字符集支持中文显示。例如,可以使用以下 SQL 查询来检查当前连接的字符集: ```sql SELECT * FROM NLS_PARAMETER WHERE PARAMETER = 'NLS_CHARACTERSET'; ``` 如果返回的字符集不是支持中文显示的字符集(如 `UTF8` 或 `GBK`),你需要调整连接配置。 #### 2. 修改数据库空间字符集 如果你的应用程序需要直接操作数据库,确保相关的空间使用了正确的字符集。可以通过创建新的空间时指定字符集来解决这个问题,也可以修改现有空间的字符集配置。 #### 3. 调整 PL/SQL 程序内部处理方式 在编写 PL/SQL 存储过程或函数时,确保对中文字符串的操作正确处理。使用适当的转换函数和字符集可以避免乱码。例如,你可以使用 `BINARY_TO_CHAR` 和 `CHAR_TO_BINARY` 函数进行数据转换,或者使用 `NLS_COMP` 参数进行比较。 #### 4. 使用工具辅助查看 有时候,在某些环境或编辑器中,文本可能会显示不正常。尝试在其他环境中打开查看文件内容,比如在文本编辑器内查看是否能够正确显示中文字符。 ### 相关问题: 1. **如何确认数据库连接使用的字符集?** - 可通过查询 `NLS_PARAMETER` 视图来获取当前连接的字符集信息。 2. **在 Oracle 中修改空间字符集的具体步骤是什么?** - 首先备份数据,然后使用 `ALTER TABLESPACE` 命令更改字符集。 3. **在 PL/SQL 内部如何安全地处理中文字符串?** - 使用 Oracle 提供的字符串处理函数,如 `TO_CSTRING` 和 `FROM_CSTRING` 来确保字符串的安全性和兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值