ORACLE里居然有这样的事?

本文记录了一次使用Oracle数据库中DBMS_STREAMS_ADM包的REMOVE_RULE过程来删除规则的具体操作经历。通过对比不同大小写的规则名称,展示了如何正确地指定要删除的规则,最终成功执行了删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提供了一个删除RULE的过程居然不好用了。

结果发现是大小写的事?

SQL> BEGIN
  2    DBMS_STREAMS_ADM.REMOVE_RULE(
  3    rule_name   =>'CMDB1',
  4    streams_type  =>'CAPTURE',
  5    streams_name   =>'STREAMS_CAPTURE'
  );
  6    7    end;
  8    /
BEGIN
*
ERROR at line 1:
ORA-24147: rule STRMADMIN.CMDB1 does not exist
ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 559
ORA-06512: at line 2


SQL>  BEGIN
  2    DBMS_STREAMS_ADM.REMOVE_RULE(
  3    rule_name   =>'CMDB',
  4    streams_type  =>'CAPTURE',
  5    streams_name   =>'STREAMS_CAPTURE'
  6    );
  7    end;
  8    /
 BEGIN
*
ERROR at line 1:
ORA-24147: rule STRMADMIN.CMDB does not exist
ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 559
ORA-06512: at line 2
SQL> BEGIN
  2     DBMS_STREAMS_ADM.REMOVE_RULE(
  3     rule_name   =>'&rule_name',
  4     streams_type  =>'CAPTURE',
  5     streams_name   =>'STREAMS_CAPTURE'
  6     );
  7  END;
  8  /
Enter value for rule_name: cmdb1
old   3:    rule_name   =>'&rule_name',
new   3:    rule_name   =>'cmdb1',
BEGIN
*
ERROR at line 1:
ORA-24147: rule SYS.CMDB1 does not exist
ORA-06512: at "SYS.DBMS_STREAMS_ADM", line 559
ORA-06512: at line 2

SQL> desc dba_rules
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 RULE_OWNER                                NOT NULL VARCHAR2(30)
 RULE_NAME                                 NOT NULL VARCHAR2(30)
 RULE_CONDITION                                     CLOB
 RULE_EVALUATION_CONTEXT_OWNER                      VARCHAR2(30)
 RULE_EVALUATION_CONTEXT_NAME                       VARCHAR2(30)
 RULE_ACTION_CONTEXT                                SYS.RE$NV_LIST
 RULE_COMMENT                                       VARCHAR2(4000)

SQL> select RULE_NAME,rule_owner,rule_condition from dba_rules;

RULE_NAME                      RULE_OWNER
------------------------------ ------------------------------
RULE_CONDITION
--------------------------------------------------------------------------------
ALERT_QUE$1                    SYS
tab.user_data.MESSAGE_LEVEL = 5 AND tab.user_data.MESSAGE_GROUP = 'High Availabi

cmdb1                          STRMADMIN
((:dml.get_object_owner() = 'cmdb') and :dml.is_null_tag() = 'Y' )

cmdb2                          STRMADMIN
((:ddl.get_object_owner() = 'cmdb' or :ddl.get_base_table_owner() = 'cmdb') and


RULE_NAME                      RULE_OWNER
------------------------------ ------------------------------
RULE_CONDITION
--------------------------------------------------------------------------------
cmdb4                          STRMADMIN
((:dml.get_object_owner() = 'cmdb') and :dml.is_null_tag() = 'Y' and :dml.get_so

cmdb5                          STRMADMIN
((:ddl.get_object_owner() = 'cmdb' or :ddl.get_base_table_owner() = 'cmdb') and


SQL> set head off
SQL> /

ALERT_QUE$1                    SYS
tab.user_data.MESSAGE_LEVEL = 5 AND tab.user_data.MESSAGE_GROUP = 'High Availabi

cmdb1                          STRMADMIN
((:dml.get_object_owner() = 'cmdb') and :dml.is_null_tag() = 'Y' )

cmdb2                          STRMADMIN
((:ddl.get_object_owner() = 'cmdb' or :ddl.get_base_table_owner() = 'cmdb') and

cmdb4                          STRMADMIN
((:dml.get_object_owner() = 'cmdb') and :dml.is_null_tag() = 'Y' and :dml.get_so

cmdb5                          STRMADMIN

((:ddl.get_object_owner() = 'cmdb' or :ddl.get_base_table_owner() = 'cmdb') and


SQL>
SQL> BEGIN
  2    DBMS_STREAMS_ADM.REMOVE_RULE(
  3    rule_name   =>'"cmdb1"',
  4    streams_type  =>'CAPTURE',
  5    streams_name   =>'STREAMS_CAPTURE'
  6    );
  7    end;
  8    /

PL/SQL procedure successfully completed.

SQL>

<think>嗯,用户问的是关于在Oracle数据库中执行ALTER USER语句来修改system用户的密码是否正确。我需要先确认这个语句的基本结构是否正确。ALTER USER的语法通常是ALTER USER username IDENTIFIED BY password;,所以这用户写的是ALTER USER system IDENTIFIED BY "Oracle@2024.";。看起来语法是正确的,用户名是system,密码是Oracle@2024.,用双引号括起来。 不过,有几个需要注意的地方。首先,Oracle的密码区分大小写,尤其是在使用双引号时。如果密码中有特殊字符,比如这的@和.,使用双引号是必要的,否则可能会报错。不过,通常Oracle推荐使用不含特殊字符的密码,或者使用双引号来包含有特殊字符或保留字的密码。所以这的写法是对的,但用户需要确保在连接时也使用双引号引用密码,否则可能会因为大小写或特殊字符导致登录失败。 另外,使用system用户需要谨慎,因为这是Oracle的一个高权限账户,修改其密码可能会影响依赖该密码的应用程序或服务。用户需要确认是否有其他系统或脚本在使用这个账户,避免修改后导致服务中断。 还有一点,密码Oracle@2024.中的点号可能在某些环境下会有问题,但因为在双引号内,应该是允许的。不过实际应用中,可能需要测试一下这个密码是否被Oracle接受,或者是否有其他限制。比如,某些策略可能要求密码长度、复杂度等,用户需要确认是否符合Oracle的密码策略要求。 总结来说,语句的语法是正确的,但需要注意密码的使用和后续的影响。用户可能需要进一步检查密码策略以及是否有依赖system账户的服务,确保修改密码不会引发其他问题。</think>您提供的 SQL 语句在语法上是**正确**的,但需要特别注意以下几点: --- ### **语句解析** `ALTER USER system IDENTIFIED BY "Oracle@2024.";` ✅ **含义** 将用户 `system` 的密码修改为 `Oracle@2024.`,语法符合 Oracle 规则。 --- ### **关键注意项** 1. **密码引号** - 如果密码包含**特殊字符**(如 `@`、`.`、空格等),必须用**双引号**包裹(如您的示例)。 - 若密码为纯字母/数字,引号可省略(例如:`BY mypassword123`)。 2. **密码大小写** - Oracle 默认**区分密码大小写**。如果密码中包含大写字母(如 `O` 和 `O`),连接时需严格匹配。 3. **用户权限** - 执行此操作需具备 `ALTER USER` 权限(通常由 `DBA` 或 `SYSDBA` 权限用户执行)。 4. **高权限用户风险** - `SYSTEM` 是 Oracle 关键管理用户,修改其密码可能导致依赖它的服务(如备份脚本、应用程序连接)中断。建议提前通知相关人员。 --- ### **验证是否生效** 修改后可通过以下方式验证: ```sql CONNECT system/"Oracle@2024."@your_database ``` 若连接成功,则密码修改成功。 --- ### **推荐实践** 1. **密码复杂度** 建议遵循安全规范,混合使用大小写字母、数字和符号(如您的示例 `Oracle@2024.`)。 2. **审计记录** 敏感操作建议记录到数据库审计日志中。 3. **备份配置** 修改关键用户密码后,及时更新相关配置文件(如 `tnsnames.ora`、应用连接池等)。 --- ### **总结** 您的语句完全正确,但需注意密码的引用方式、大小写敏感性和对系统的影响。如果是生产环境,建议在维护窗口操作并做好回退计划。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值