创建视图并且不应允许任何数据操作语言操作

Posted

技术标签:

【中文标题】创建视图并且不应允许任何数据操作语言操作【英文标题】:Create a view and should not allow any data manipulation language operations 【发布时间】:2020-12-23 14:56:00 【问题描述】:

问:创建一个名为TITLE_NOTRETURNED 的视图来显示电影标题和 尚未返回的媒体的 media_id。视图不应允许任何数据操作语言操作。

我需要创建视图作为附加问题,但它返回的错误是我缺少表达式。

租借历史表: 出租日期,归还日期

媒体表: 媒体ID,格式

电影表: 标题ID,标题

我的代码:

CREATE VIEW TITLE_NOTRETURNED AS
SELECT mov.title, m.mediaid, r.rentaldate
FROM Movies mov, Media m, rental_history r
WHERE mov.titleid = m.titleid
AND m.mediaid = r.mediaid
AND r.returndate > (SELECT CONVERT(DATE, getdate() )
);

另外,我之前尝试过将rental_history r 更改为rentaldate r,但它也不起作用。

ERD:

【问题讨论】:

Oracle 还是 mysql 首先,改成现代ANSI join语法。 【参考方案1】:

如果这是 Oracle,它会给出 ORA-00936: missing expression 因为

select convert(date, getdate())

缺少from 子句。

一旦你解决了这个问题,convert 用于字符集,而不是日期,date 是用于引入 date literal 的关键字,例如 date '2020-12-23',并且没有 getdate() 函数(除非你自己写的)。

一个固定版本(包括防止 DML 的要求)是:

create or replace view title_not_returned as
select mov.title, m.mediaid, r.rentaldate
from   movies mov
       join media m on m.titleid = mov.titleid
       join rental_history r on r.mediaid = m.mediaid
where  r.returndate > trunc(sysdate)
with read only;

顺便问一下,租金归还日期是如何填写的?如果它们默认为某个遥远的未来日期,例如 9999 年 12 月 31 日,然后在返回时更新为实际日期,这将起作用(但也许应该在视图中使用特殊日期)。如果它们以 null 开头,表示尚未返回,则不会得到任何结果。

【讨论】:

以上是关于创建视图并且不应允许任何数据操作语言操作的主要内容,如果未能解决你的问题,请参考以下文章

Mysql中高级操作中的视图_事务_索引_账户权限管理

视图与索引

视图模式及T-SQL语句操作管理SQL Server数据库

数据库原理实验四——视图与索引

mysql视图的操作

C++ 中的音频操作