前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL命令 CREATE VIEW(一)

SQL命令 CREATE VIEW(一)

作者头像
用户7741497
发布于 2022-04-18 10:07:55
发布于 2022-04-18 10:07:55
6.5K10
代码可运行
举报
文章被收录于专栏:hml_知识记录hml_知识记录
运行总次数:0
代码可运行

创建视图

大纲

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE [OR REPLACE] VIEW view-name [(column-commalist)]
       AS select-statement 
       [ WITH READ ONLY  |  WITH [level] CHECK OPTION ]

参数

  • view-name - 正在创建的视图的名称。有效的标识符,受与表名相同的附加命名限制。视图名称可以是限定的(schema.viewname),也可以是不限定的(Viewname)。未限定的视图名称采用默认架构名称。请注意,同一架构中的表和视图不能使用相同的名称。
  • column-commalist - 可选-组成视图的列名、一个或多个有效标识符。如果指定,此列表括在圆括号中,列表中的项目用逗号分隔。
  • AS select-statement - 定义视图的SELECT语句。
  • WITH READ ONLY - 可选-指定不能通过此视图对视图所基于的表执行插入、更新或删除操作。默认情况下,允许通过视图执行这些操作,但要遵守下面描述的约束条件。
  • WITH level CHECK OPTION - 可选-指定如何通过此视图对视图所基于的表执行插入、更新或删除操作。级别可以是关键字LOCALCASCADED。如果未指定级别,则WITH CHECK选项默认为级联。

描述

CREATE VIEW命令定义视图的内容。定义视图的SELECT语句可以引用多个表,也可以引用其他视图。

权限

CREATE VIEW命令是特权操作。用户必须具有%CREATE_VIEW管理权限才能执行CREATE VIEW。否则将导致%msg用户‘name’没有%CREATE_VIEW权限的SQLCODE-99错误。如果拥有适当的授予权限,则可以使用GRANT命令分配%CREATE_VIEW权限。

要从正在创建的视图的SELECT子句中引用的对象中进行选择,需要具有适当的权限:

  • 使用动态SQL或xDBC创建视图时,必须对从视图引用的基础表(或视图)中选择的所有列具有SELECT权限。如果对指定表(或视图)没有SELECT权限,则不会执行CREATE VIEW命令。

但是,在编译投影已定义视图的类时,不会对从视图引用的基础表(或视图)中选择的列强制执行这些SELECT特权。例如,如果使用特权例程(具有这些SELECT权限)创建视图,则可以在以后编译视图类,因为是视图的所有者,而不管是否对视图引用的表具有SELECT权限。

  • 若要获得视图的SELECT特权WITH GRANT OPTION,则必须对该视图引用的每个表(或视图)都具有WITH GRANT OPTION
  • 若要接收视图的INSERTUPDATEDELETEREFERENCES权限,必须对该视图引用的每个表(或视图)具有相同的权限。要接收其中任何权限的WITH GRANT OPTION,必须在基础表上拥有PRIVICATION WITH GRANT OPTION
  • 如果该视图指定为只读,则不会授予该视图INSERTUPDATEDELETE权限,无论您对基础表拥有哪些权限。如果稍后将视图重新定义为读/写,则在重新编译投影视图的类时会添加这些权限。

可以通过调用%CHECKPRIV命令来确定当前用户是否拥有这些表级权限。可以通过调用$SYSTEM.SQL.Security.CheckPrivileve()方法来确定指定用户是否拥有这些表级权限。

编译视图时,视图的创建者(所有者)被授予%ALTER PRIVATION WITH GRANT选项。

在嵌入式SQL中,可以使用$SYSTEM.Security.Login()方法以具有适当权限的用户身份登录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(      )

必须具有%Service_Login:Use权限才能调用$SYSTEM.Security.Login方法。

%CREATE_VIEW权限是通过GRANT命令分配的,这需要将此权限分配给用户或角色。 默认情况下,强制执行CREATE VIEW安全特权。 这个权限要求是可在系统范围内配置的,使用$SYSTEM.SQL.Util.SetOption()方法SET status=$SYSTEM.SQL.Util.SetOption("SQLSecurity",0,.oldval); 要确定当前设置,调用$SYSTEM.SQL.CurrentSettings()方法,该方法显示启用SQL安全的设置。

默认值是1(启用)。 当SQL Security被启用时,用户只能对已被授予权限的表或视图执行操作。 这是该选项的推荐设置。

如果此方法设置为0,则更改此设置后启动的任何新进程将禁用SQL Security。 这意味着禁止基于特权的表/视图安全性。 可以在不指定用户的情况下创建表。 在本例中,动态SQL将“_SYSTEM”指定为user,嵌入式SQL“”(空字符串)指定为user。 任何用户都可以对表或视图执行操作,即使该用户没有这样做的特权。

视图命名约定

视图名称与表名具有相同的命名约定,并且共享相同的名称集。因此,不能对同一架构中的表和视图使用相同的名称。尝试这样做会导致SQLCODE-201错误。若要确定当前命名空间中是否已存在表,请使用$SYSTEM.SQL.Schema.TableExists(“schema.tname”)方法。投射同名的表定义和视图定义的类也会生成SQLCODE-201错误。

视图名称遵循标识符约定,并受以下限制的约束。默认情况下,视图名称是简单标识符。视图名称不应超过128个字符。视图名称不区分大小写。

IRIS使用视图名称生成相应的类名。类名仅包含字母数字字符(字母和数字),并且在前96个字符内必须是唯一的。要生成这个类名, IRIS首先从视图名称中去掉标点符号,然后生成一个在前96个字符内唯一的标识符,在需要创建唯一的类名时用一个整数(从0开始)代替最后一个字符。 IRIS从有效的视图名称生成唯一的类名,但此名称生成对视图的命名施加了以下限制:

  • 视图名称必须至少包含一个字母。视图名称的第一个字符或首个标点符号字符后的第一个字符必须是字母。
  • IRIS支持视图名称使用16位(宽)字符。如果字符通过$ZNAME测试,则该字符是有效字母。
  • 如果视图名称的第一个字符是标点符号,则第二个字符不能是数字。这会导致SQLCODE-400错误,%msg值为Error#5053:类名‘schema.name’无效(没有标点符号)。例如,指定视图名称%7A会生成%msg错误#5053:类名‘User.7A’无效。
  • 由于生成的类名不包括标点符号,因此不建议(尽管可能)创建仅在标点符号方面与现有视图或表名不同的视图名称。在这种情况下, IRIS用一个整数(从0开始)代替名称的最后一个字符,以创建唯一的类名。
  • 视图名称可能比96个字符长得多,但前96个字母数字字符不同的视图名称更易于使用。

视图名称可以是限定的,也可以是非限定的。

限定的视图名称(schema.viewname)可以指定现有架构或新架构。如果指定了新架构,系统将创建该架构。

未限定的视图名称(视图名称)采用默认架构名称。

Existing View

要确定指定的视图是否已经存在于当前命名空间中,请使用$SYSTEM.SQL.Schema.ViewExists("schema.vname")方法。

当创建与现有视图同名的视图时,会发生什么取决于可选的OR REPLACE关键字和配置设置。

With OR REPLACE

如果指定CREATE OR REPLACE VIEW,则现有视图将被SELECT子句中指定的视图定义和任何指定的WITH READ ONLYWITH CHECK OPTION替换。 这与执行相应的ALTER VIEW语句相同。 已授予原始视图的任何特权仍然保留。

这个关键字短语没有提供ALTER VIEW不可用的功能。 它是为兼容Oracle SQL代码而提供的。

Without OR REPLACE

默认情况下,如果指定CREATE VIEW, IRIS将拒绝使用现有视图的名称创建视图的尝试,并发出SQLCODE -201错误。 要确定当前设置,调用$SYSTEM.SQL.CurrentSettings(),它为现有的表或视图设置显示一个Allow DDL CREATE TABLECREATE VIEW。 默认值是0 (No),这是推荐的设置。 如果此选项设置为1 (Yes), IRIS将删除与视图关联的类定义,然后重新创建它。 这与先执行DROP VIEW,然后执行CREATE VIEW非常相似。 注意,此设置同时影响CREATE VIEWCREATE TABLE

在管理门户、系统管理、配置、SQL和对象设置、SQL中,可以通过选择“忽略冗余DDL语句”复选框,在系统范围内设置此选项(以及其他类似的创建、更改和删除选项)。

列名

视图可以有选择地包括用括号括起来的列名的列分隔符列表。 这些列名(如果指定的话)是在使用该视图时用于访问和显示列的数据的名称。

如果省略了列逗号,下面的应用程序:

  • 选择源表的列名用于在使用视图时访问和显示数据。
  • 如果任何选择源表列名具有列别名,则列别名是使用视图时用于访问和显示数据的名称。
  • 如果选择源表列名具有表别名,则在使用视图时用于访问和显示数据的名称中不会使用表别名。

如果省略列名列表,则还必须省略圆括号。

如果指定列COMMANCEL,则以下情况适用:

  • 列名列表必须指定外围括号,即使指定单个字段也是如此。多个列名之间必须用逗号分隔。在列注释器中允许有空格和注释。
  • 列名的数量必须与SELECT语句中指定的列数相对应。视图列数和查询列数之间的不匹配导致编译时出现SQLCODE-142错误。
  • 列名的名称必须是有效的标识符。它们可以是与选择列名不同的名称、与选择列名相同的名称或两者的组合。视图列名的指定顺序与选择列名的顺序相对应。由于可以为视图列分配不相关的选择列的名称,因此在分配视图列名称时必须格外小心。
  • 列名必须是唯一的。指定重复的列名会导致SQLCODE-97错误。列名通过去除标点符号转换为相应的类属性名;允许使用仅在标点符号方面不同的列名,但不鼓励这样做。

下面的示例显示了一个包含视图列和查询列匹配列表的创建视图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE VIEW MyView (ViewCol1, ViewCol2, ViewCol3) AS
     SELECT TableCol1, TableCol2, TableCol3 
     FROM MyTable

或者,也可以在查询中使用AS关键字将视图列指定为查询列/视图列对,如下例所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE VIEW MyView AS 
  SELECT TableCol1 AS ViewCol1,
     TableCol2 AS ViewCol2,
     TableCol3 AS ViewCol3
     FROM MyTable

选择列和查看列

可以将多个选择列中的数据连接到单个视图列中。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE VIEW MyView (fullname) AS SELECT firstname||' '||lastname FROM MyTable

多个视图列可以引用同一选择列。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE VIEW MyView (lname,surname) AS SELECT lastname,lastname FROM MyTable

SELECT子句注意事项

视图不必是一个特定表的行和列的简单子集。 可以使用任意复杂度的SELECT子句创建视图,指定表或视图的任意组合。 然而,对于视图定义的SELECT子句有一些限制:

  • 只有当ORDER BY子句与TOP子句成对出现时,才能包括此子句。如果希望包括视图中的所有行,可以使用TOP ALL子句。可以包含不带ORDER BY子句的TOP子句。但是,如果包含没有TOP子句的ORDER BY子句,则会生成SQLCODE-143错误。如果从视图类投影SQL视图,而视图类的查询包含ORDER BY子句,则在视图投影中将忽略ORDER BY子句。
  • 不能包含主机变量。如果尝试在SELECT子句中引用主机变量,系统将生成SQLCODE-148错误。
  • 不能包含INTO关键字。可以创建使用INTO子句指定SELECT的视图,但该视图的执行失败,并出现SQLCODE-25错误。

CREATE VIEW可以包含UNION语句,以从两个表的联合中选择列。可以指定UNION,如下面的嵌入式SQL示例所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ClassMethod CreateView()
{
    d $SYSTEM.Security.Login("_SYSTEM","SYS")
    &sql(
        CREATE VIEW MyView (vname,vstate) AS
            SELECT t1.name,t1.home_state
            FROM Sample.Person AS t1
            UNION
            SELECT t2.name,t2.office_state
            FROM Sample.Employee AS t2
    )
    if SQLCODE = 0 { 
        w !,"创建视图" 
    } else { 
        w "创建视图错误 SQLCODE=",SQLCODE 
    }
}

请注意,非限定视图名称(如上例中)默认为默认模式名称(例如,初始模式默认SQLUser.MyView),即使视图引用的表在示例模式中也是如此。因此,通常最好总是限定视图名称,以确保它与其关联表一起存储。

View ID: %vid

通过视图访问数据时, IRIS会为该视图返回的每一行分配一个连续的整数视图ID(%VID)。与表行ID编号一样,这些视图行ID编号是系统分配的、唯一的、非零的、非空的和不可修改的。此%VID通常是不可见的。与表行ID不同,它在使用星号语法时不会显示;只有在SELECT中显式指定时才会显示。%vid可用于进一步限制SELECT访问视图返回的行数

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
1
1
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
CircleCI vs Travis CI vs Jenkins
选择CI解决方案并没有灵丹妙药。您的选择将取决于您的团队规模,编程语言以及诸如个人喜好之类的简单内容。这就是为什么根据上述标准比较每个工具的特性很重要的原因。但是,某些工具已在市场上赢得了领导者的地位。这些领导者包括CircleCI,Travis CI和Jenkins。
DevOps云学堂
2020/01/16
2.2K0
CircleCI vs Travis CI vs Jenkins
3天学会Jenkins_Jenkin与CI(Continuous Integration,持续集成)?
持续集成(Continuous Integration)即是发生在每一次的代码提交后,立即开始软件的构建(Build)和测试(Test),在一个拥有许多开发人员的大型项目中,一天中会多次提交,伴随着每个提交代码的构建和测试,如果测试通过,则测试构建以进行部署。如果部署成功,则代码将推送到生产环境。提交(commit),构建(build),测试(test)和部署(deploy)是一个连续的过程,因此称为持续集成/部署。
别打名名
2019/12/23
8070
3天学会Jenkins_Jenkin与CI(Continuous Integration,持续集成)?
推介7个CI / CD(持续集成和持续部署)工具
越来越多的工程团队正在采用敏捷开发,推动更短,更快的发布周期。代码库增长和创建新生产构建的频率导致持续集成和持续部署/交付工具的兴起。
Java架构师历程
2018/09/26
24K0
推介7个CI / CD(持续集成和持续部署)工具
2020年务必要了解的最好用的14款CI/CD工具
企业正在朝着DevOps方法论和敏捷文化迈进,以加快交付速度并确保产品质量。在DevOps中,连续和自动化的交付周期是使快速可靠的交付成为可能的基础。
Peter Shen
2020/06/12
5.7K0
2020年务必要了解的最好用的14款CI/CD工具
DevOps的最佳CI/CD工具
CI/CD是一种 DevOps 方法,它结合了持续集成和持续交付的概念,允许企业通过在软件开发生命周期中集成自动化来始终如一地向客户交付应用程序。
西岸Alex
2023/08/22
9670
DevOps的最佳CI/CD工具
TeamCity VS Jenkins:选择正确的CI / CD工具
每个软件开发周期都涉及三个主要阶段:构建,测试和部署。这三个阶段中的任何一个滞后都会导致产品发布的延迟。为了避免此类延迟,组织依靠CI / CD工具来自动化这些过程。但是最近,随着对CI / CD工具的快速需求,选择泛滥,选择正确的工具可能是艰巨的任务!
用户7466307
2020/07/20
7.4K0
12个可以替代jenkins的CI/CD工具
Jenkins是一个开源的持续集成平台,是DevOps生命周期中的一个重要工具。但是,与当前的用户界面趋势相比,它的界面已经过时,用户界面也不够友好(苦叶子推荐你用script pipeline: Jenkins之jenkinsfile基础)。此外,Jenkin配置可能比较复杂,而且它还有许多其他缺点。
苦叶子
2020/02/25
12.2K0
12个可以替代jenkins的CI/CD工具
21 个好用的持续集成工具,总有一款适合你
市场上持续集成工具众多,找到一个合适的工具并非易事,下面介绍了 21 个比较受欢迎的 CI 工具,并附上了下载链接。
DevOps时代
2019/05/17
2.8K0
CI/CD 工具选型:Jenkins 还是 Bamboo?
持续集成和持续交付是在软件开发生命周期中获得交付一致性的方法。作为一个流程,它帮助你自动化开发管道,同时确保所有事情都可跟踪。其中有趣的部分是在开发阶段中引入自动化。当我们谈到集成和交付时,另一个与之匹配的过程是“持续测试”,或者有时我们称之为 DevOps 测试。虽然持续集成(CI)和持续交付(CD)已经成为 DevOps 的重要组成部分,但在选择最佳工具时,DevOps 团队常常会陷入困境。如果没有 CI/CD 工具是无法想象的。
深度学习与Python
2020/11/16
6.1K1
CI/CD 工具选型:Jenkins 还是 Bamboo?
软件开发常说的CI/CD是什么
本文翻译自国外论坛 medium,原文地址:本文翻译自国外论坛 medium,原文地址:https://medium.com/gitconnected/basics-of-ci-cd-a98340c60b04
wayn
2023/09/01
3220
软件开发常说的CI/CD是什么
深入解析Jenkins中的CI与CD:区别与实践
在当今快速发展的软件开发领域,敏捷开发和DevOps理念愈发深入人心。Jenkins作为一款强大的开源自动化服务器,在持续集成(CI)和持续交付/部署(CD)中发挥着关键作用。理解Jenkins中CI和CD的区别,对于构建高效的软件开发流程、提升软件质量和交付速度至关重要。本文将深入探讨Jenkins中的CI与CD,帮助读者更好地把握二者的区别与实践要点。
Front_Yue
2025/02/14
1301
深入解析Jenkins中的CI与CD:区别与实践
六款不容错过的开源持续集成工具
持续集成是敏捷软件开发工作当中的一大组成部分。从一轮冲刺到下一轮冲刺,技术团队在“不断前进”的同时持续推出各类增量化功能。不过当开发人员高度专注于添加功能的同时,代码错误有时候也会不期而至、并导致软件无法正常使用。为了阻止此类错误被集成至软件配置管理(简称SCM)方案当中,持续集成服务器则扮演守门人的角色,帮助我们对代码质量进行把关。即使糟糕代码已经被集成到SCM当中,持续集成服务器仍然能够快速告诉我们是哪里出了问题。在今天的文章中,我们就将共同了解六款开源持续集成服务器工具,相信它们能帮助大家在自己的
静一
2018/03/23
1K0
六款不容错过的开源持续集成工具
CI/CD 工具选型:Jenkins 还是 GitLab CI/CD?
近十年来,持续集成(Continuous Integration,CI)和持续交付(Continuous Delivery,CD)领域都取得了很大的进步。DevOps 测试的兴起导致了对 CI/CD 工具的快速需求。现有的解决方案总是随着时间的推移而改进,大量新产品或新版本正在进入 QA 领域。当你手头有这么多选项时,选择正确的工具确实会有一点儿挑战。
Guide哥
2020/10/30
3.2K0
CI/CD 工具选型:Jenkins 还是 GitLab CI/CD?
20+最好的持续集成工具
整理了20多款持续集成工具,这是作为软件测试人员需要了解的,也是在构建持续质量改进时,需要进行选型的基础设施工具。
苦叶子
2019/05/30
3.8K0
2020年10种最佳持续集成工具
技术正呈指数级增长,并且要参与其中,组织别无选择,只能采用技术。谈论“技术”基本上意味着创建“更快,更方便”和“定性”的解决方案。为了跟上高要求的技术动态,不仅人力资源需要与这个行业的同时发展相适应,而且迫切需要高度标准化的流程以提供一流的结果。那时就出现了DevOps的需求。从计划到交付,引入DevOps的想法是通过持续交付和持续集成之间的开发和自动化系统协作来保持质量。为了简化起见,必须有一种便捷的方法来处理复杂的情况,而不会拖延并按时交付。因此,持续集成工具的引入使开发人员可以更轻松地简化开发流程。
DevOps云学堂
2020/03/24
7.9K0
『Jenkins』Jenkins入门教程:从零到一的CI/CD实现
Jenkins 是一个开源的自动化服务器,广泛应用于持续集成(CI)和持续交付(CD)的流程中。它允许开发团队自动化构建、测试、部署等过程,提高开发效率、减少人工干预和错误。在现代软件开发中,Jenkins被广泛应用于各种规模的项目中,帮助开发团队实现自动化的工作流。
数字扫地僧
2025/01/18
2080
从开源到云端:最值得关注的CI/CD工具与企业适配方案
随着DevOps的普及,持续集成与持续交付(CI/CD)工具成为企业提升开发效率的关键。本文结合当前技术趋势与工具特性,为您推荐十大CI/CD工具,并重点介绍国内优秀代码托管平台Gitee的CI/CD解决方案。
用户11533487
2025/04/15
2190
开发事半功倍,25款最好用的自动化软件部署工具|附下载地址
选择一个号的软件部署工具是一个很棘手的问题,因为对一个开发团队来说,对于他们适合的工具可能无法满足另外一个团队的需求,本文收集了25个最好的软件部署工具,用以帮助多个开发团队简化他们的工作流程,优化效
BestSDK
2018/03/02
10.2K0
开发事半功倍,25款最好用的自动化软件部署工具|附下载地址
深入解析CI/CD:Jenkins与GitLab CI的实战应用
在现代软件开发中,持续集成(CI)和持续部署(CD)已经成为提高开发效率和软件质量的关键实践。本文将详细介绍两种常用的CI/CD工具——Jenkins和GitLab CI,并通过实例代码展示它们的实际应用。
Echo_Wish
2024/10/12
4890
深入解析CI/CD:Jenkins与GitLab CI的实战应用
在现代软件开发中,持续集成(CI)和持续部署(CD)已经成为提高开发效率和软件质量的关键实践。本文将详细介绍两种常用的CI/CD工具——Jenkins和GitLab CI,并通过实例代码展示它们的实际应用。
Echo_Wish
2024/10/11
2290
深入解析CI/CD:Jenkins与GitLab CI的实战应用
推荐阅读
相关推荐
CircleCI vs Travis CI vs Jenkins
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验