materialized view Define Constraints on Views【每日一译】--20121204

本文探讨了Oracle数据库如何通过识别关系完整性约束来组织多维数据,并介绍了如何利用视图及其约束来增强这一过程,即使在复杂或受限环境中也能实现。
Data warehousing applications recognize multidimensional data in the Oracle
database by identifying Referential Integrity (RI) constraints in the relational schema.
RI constraints represent primary and foreign key relationships among tables. By
querying the Oracle data dictionary, applications can recognize RI constraints and
therefore recognize the multidimensional data in the database. In some environments,
database administrators, for schema complexity or security reasons, define views on
fact and dimension tables. Oracle provides the ability to constrain views. By allowing
constraint definitions between views, database administrators can propagate base
table constraints to the views, thereby allowing applications to recognize

multidimensional data even in a restricted environment.

数据仓库应用组织多维数据在库里通过支持关系完整性约束在关系对象里。关系约束表现

为主键和外键在多表间的关系。通过查询ORACLE的数据字典,应用可以清楚RI约束并且

可以识别在库里的多维数据。在一些环境里,DBA,出于对象的复制或者安全的理由,定义

视图在实表和维度表。ORACLE提供了约束视图的能力。通过允许定义约束在多个视图间,

DBA可以让基表的约束用在视图上,所以允许应用去组织多维数据甚至在一个受限的环境里。

Only logical constraints, that is, constraints that are declarative and not enforced by
Oracle, can be defined on views. The purpose of these constraints is not to enforce any
business rules but to identify multidimensional data. The following constraints can be

defined on views:

只有逻辑约束,也就是,约束是可定义的并且不是通过ORACLE强制的,它可以定义在视图上。

这些约束的目的不是强制任何的商业规则而是为了支持多维数据。以下的约束可以定义在视图上:

■ Primary key constraint

■ Unique constraint
■ Referential Integrity constraint
Given that view constraints are declarative, DISABLE, NOVALIDATE is the only valid
state for a view constraint. However, the RELY or NORELY state is also allowed,
because constraints on views may be used to enable more sophisticated query
rewrites; a view constraint in the RELY state allows query rewrites to occur when the
rewrite integrity level is set to trusted mode.

#主键的约束

#唯一约束

#关系完整性约束

鉴于这种观点约束是可定义,DISABLE,NOVALIDATE是仅有的可用的视图约束状态。况且

RELY或者NORELY状态也是允许的,因为在这些视图上的约束可以用于开启更多的复制查询重写;

一个视图的约束在RELY状态允许查询写入的发生在当重写完整性级别被设为信任模式时。

Note: Although view constraint definitions are declarative in nature,
operations on views are subject to the integrity constraints defined on
the underlying base tables, and constraints on views can be enforced
through constraints on base tables

备注:尽管视图约束定义是可定义的在正常情况下,视图上的操作要服务定义在基表的完整性约束,

并且视图可以被强制通过在基表上的约束。

下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装和调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由和构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
<think>您提供的SQL片段存在 **ORA-00922: missing or invalid option** 错误。以下是详细分析和修复方案: --- ### 🔍 错误原因分析 1. **语法结构缺陷** 物化视图定义中缺少必要的 **基础查询语句**(`AS SELECT ...` 子句不完整)。 - 错误定位:在 `AS` 关键字后立即换行且未接有效的SELECT语句 2. **保留字冲突风险** `V_EXTRA_REWARD1` 中的下划线命名虽合法,但需确认非保留字(如 `REWARD` 是Oracle保留字) 3. **快速刷新限制** `REFRESH FAST ON COMMIT` 要求物化视图必须满足特定条件(如包含物化视图日志),但此错误发生在解析阶段,与限制无关 --- ### 🛠️ 修复后的正确语法 ```sql CREATE OR REPLACE MATERIALIZED VIEW v_extra_reward1 REFRESH FAST ON COMMIT AS -- 此处必须紧跟SELECT语句,不能换行中断 SELECT employee_id, SUM(bonus) AS total_reward FROM reward_transactions GROUP BY employee_id; -- 必须补全有效的SELECT查询 ``` ### ⚠️ 关键修复点 | 错误位置 | 修复操作 | 原因说明 | |----------------|-----------------------------------|----------------------------| | `AS` 后换行 | 删除 `AS` 后的换行符 | SQL解析器要求 `AS` 后立即接查询 | | 未完成SELECT语句 | 补全有效的SELECT子句 | 物化视图必须有数据来源 | | 保留字验证 | 检查 `REWARD` 在上下文是否冲突 | 避免后续 ORA-01748 错误 | --- ### 📌 快速刷新必要条件(预防后续错误) 1. **基表需有物化视图日志** ```sql CREATE MATERIALIZED VIEW LOG ON reward_transactions WITH ROWID, SEQUENCE (employee_id, bonus) INCLUDING NEW VALUES; ``` 2. **SELECT语句限制** - 不能使用 `DISTINCT` 或聚合函数(除非包含 `COUNT(*)`) - 必须包含所有主键列的 `ROWID` --- ### ✅ 最终验证脚本 ```sql -- 步骤1:创建物化视图日志 CREATE MATERIALIZED VIEW LOG ON reward_transactions WITH SEQUENCE, ROWID (employee_id, bonus) INCLUDING NEW VALUES; -- 步骤2:创建物化视图(修正版) CREATE MATERIALIZED VIEW v_extra_reward1 REFRESH FAST ON COMMIT AS SELECT employee_id, SUM(bonus) AS total_reward, -- 快速刷新必须包含ROWID ROWIDTOCHAR(rt.rowid) AS row_id FROM reward_transactions rt GROUP BY employee_id, rt.rowid; ``` > **注意**:聚合视图必须显式包含 `ROWID` 才能使用快速刷新,这是Oracle的强制要求。 §§相关问题§§ 1. 当物化视图包含聚合函数时,`REFRESH FAST ON COMMIT` 需要满足哪些额外条件? 2. 为什么在快速刷新的物化视图中必须包含ROWID或主键? 3. 如何解决因物化视图日志缺失导致的ORA-23413错误? 4. 创建包含JOIN操作的快速刷新物化视图有哪些语法限制? 5. 物化视图命名中使用下划线有哪些潜在风险?如何规避? </think> 您的SQL语句 `CREATE OR REPLACE MATERIALIZED VIEW V_EXTRA_REWARD1 REFRESH FAST ON COMMIT AS` 触发 **ORA-00922: 缺失或无效选项** 错误的主要原因是**基础SELECT查询不完整**。以下是详细分析和修复方案: --- ### 🔍 错误根源分析 1. **核心问题** `AS` 关键字后**缺少完整的SELECT查询语句**(只有`SELECT`关键词但无实际内容) 2. **语法结构验证** 正确物化视图语法必须包含: ```sql CREATE MATERIALIZED VIEW [名称] REFRESH [刷新方式] ON [触发时机] AS [完整的SELECT语句]; -- ← 此处缺少关键内容 ``` 3. **快速刷新限制**(潜在后续错误) - 使用 `REFRESH FAST ON COMMIT` 要求: - 基表必须存在物化视图日志 - SELECT语句需满足快速刷新限制(如不能有聚合、连接等) --- ### 🛠️ 修复后的完整SQL ```sql CREATE OR REPLACE MATERIALIZED VIEW V_EXTRA_REWARD1 REFRESH FAST ON COMMIT AS -- 必须添加有效的SELECT查询 SELECT transaction_id, user_id, reward_amount, transaction_date FROM reward_transactions WHERE status = 'COMPLETED'; -- 示例查询 ``` ### ⚠️ 关键修复点 | 错误点 | 修复方案 | 说明 | |----------------|-----------------------------|-----------------------------| | `AS`后无查询 | 添加完整SELECT语句 | 必须包含FROM和有效列 | | 缺少条件限定 | 添加WHERE子句(可选) | 确保查询逻辑完整 | | 刷新条件验证 | 确认基表有物化视图日志 | 避免后续 ORA-23413 错误 | --- ### 📌 快速刷新必要条件 1. **创建物化视图日志** ```sql -- 在基表上创建日志 CREATE MATERIALIZED VIEW LOG ON reward_transactions WITH ROWID, SEQUENCE (user_id, reward_amount) INCLUDING NEW VALUES; ``` 2. **SELECT语句限制** ```sql -- 有效快速刷新查询示例 SELECT rt.rowid AS rid, -- 必须包含ROWID COUNT(*) OVER() AS total_count -- 允许分析函数 FROM reward_transactions rt; ``` 3. **禁止元素**: ```markdown - ❌ `DISTINCT` - ❌ `GROUP BY`(聚合函数) - ❌ 某些类型的JOIN ``` --- ### ✅ 最终验证脚本 ```sql -- 1. 创建物化视图日志 CREATE MATERIALIZED VIEW LOG ON reward_transactions WITH ROWID, SEQUENCE (user_id, reward_amount, transaction_date); -- 2. 创建带完整查询的物化视图 CREATE OR REPLACE MATERIALIZED VIEW V_EXTRA_REWARD1 REFRESH FAST ON COMMIT AS SELECT rt.ROWID AS mview_rowid, -- 快速刷新必备 rt.user_id, SUM(rt.reward_amount) OVER(PARTITION BY rt.user_id) user_total FROM reward_transactions rt WHERE rt.status = 'COMPLETED'; ``` > **注意**:如果仍需聚合操作,考虑改用 `REFRESH COMPLETE` 或使用预聚合表方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值