多重租赁数据库系统中的数据分离和写入重新定向的制作方法

文档序号:18475308发布日期:2019-08-20 20:57阅读:182来源:国知局
本申请是于2017年10月26日提交的标题为“在多重租赁数据库系统中的系统共享类型(systemsharingtypesinmulti-tenancydatabasesystems)”(代理人案卷号22135-1088001/170465us01)的美国申请序列号为15/794,261的申请的共同未决申请;并且还是于2017年10月26日提交的标题为“多重租赁数据库系统中系统共享类型之间的转换(transitioningbetweensystemsharingtypesinmulti-tenancydatabasesystems)”(代理人案卷号22135-1091001/170673us01)的美国申请序列号为15/794,501的申请的共同未决申请;并且还是于2017年10月26日提交的标题为“多重租赁数据库系统中的键模式管理(keypatternmanagementinmulti-tenancydatabasesystems)”(代理人案卷号22135-1092001/170674us01)的美国申请序列号为15/794,368的共同未决申请;并且还是于2017年10月26日提交的标题为“在多重租赁数据库系统中部署改变(deployingchangesinamulti-tenancydatabasesystem)”(代理人案卷号22135-1094001/170613us01)的美国申请序列号为15/794,335的共同未决申请;并且还是于2017年10月26日提交的标题为“在多重租赁数据库系统中的部署对键模式的改变(deployingchangestokeypatternsinmulti-tenancydatabasesystems)”(代理人案卷号22135-1096001/170676us01)的美国申请序列号为15/794,381的申请的共同未决申请;并且还是于2017年10月26日提交的标题为“在多重租赁数据库系统中交换共享容器和适应租户(exchangingsharedcontainersandadaptingtenantsinmulti-tenancydatabasesystems)”(代理人案卷号22135-1098001/170545us01)的美国申请序列号为15/794,362的申请的共同未决申请;并且还是于2017年10月26日提交的标题为“在多重租赁数据库系统中跨共享的容器和租户容器修补内容(patchingcontentacrosssharedandtenantcontainersinmulti-tenancydatabasesystems)”的美国申请序列号为15/794,424的申请的共同未决申请(代理人案卷号22135-1099001/170544us01);每个申请和作为整体申请的全部内容通过引用并入本文。本公开涉及用于多重租赁数据库系统中的数据分离和写入重新定向的计算机实施的方法、软件和系统。
背景技术
::多重租赁软件架构可以包括在服务器上运行并服务多个租户的软件应用的单个实例。租户是共享对软件实例的公用访问的一组用户。在多重租赁架构中,软件应用可以被设计为为每个租户提供专用的实例共享——包括租户专用的数据、配置、用户管理和租户专用的功能。多重租赁可以被用于云计算。技术实现要素:本公开涉及用于多重租赁数据库系统中的数据分离和写入重新定向的系统、软件和计算机实施的方法。一个示例方法包括向至少一个应用提供对数据库系统的访问。从应用接收查询。做出查询与联合视图相关联的确定,该联合视图提供对共享数据容器中的第一只读表和租户数据库容器中的第一可写入表的统一访问。做出关于查询是读取查询还是写入查询的确定。响应于确定查询是读取查询,使用联合视图来处理查询。响应于确定查询是写入查询,修改查询以使用第一可写入表,并且使用可写入表来处理查询。虽然通常描述为具体体现在处理和变换(transform)各个数据的有形介质上的计算机实施的软件,但是这些方面中的一些或全部可以是计算机实施的方法,或者进一步被包括在各个系统或其他设备中以执行所描述的功能。在附图和下面的描述中阐述了本公开的这些和其他方面的细节以及实施例。本公开的其他特征、目的和优点将从说明书和附图以及权利要求中显而易见。附图说明图1是示出用于多重租赁的示例系统的框图。图2示出了用于具有标准数据库设置的应用的示例系统。图3示出了其中为多个、不同租户将相同内容存储在不同数据库容器中的一个示例非多重租赁系统。图4a示出了说明租户的数据的拆分的示例系统。图4b示出了包括多个表类型中的每一个类型的多个表的示例多重租赁系统。图4c示出了使用后缀表命名方案的示例多重租赁系统。图5和图6示出了包括共享数据库容器、第一租户的第一租户数据库容器、和第二租户的第二租户数据库容器的示例系统。图7示出了用于约束执行(constraintenforcement)的系统。图8示出了用于根据所配置的租户键来部署内容的示例系统。图9示出了用于改变租户键的示例系统。图10示出了用于更新数据库记录以符合经更新的租户键的示例系统。图11示出了用于使用传输(transfer)文件来更新数据库记录以符合经更新的租户键的示例系统。图12示出了用于更新非活动租户键记录的示例系统。图13a示出了包括具有标准系统共享类型的标准系统、和具有共享/租户系统共享类型的共享/租户系统的示例系统。图13b是示出可以针对标准数据库容器、共享数据库容器和租户数据库容器执行的处理的表。图14示出了用于从标准系统转换(transition)到共享/租户系统的系统。图15示出了具有模拟的共享类型的系统。图16示出了用于从标准系统转换到模拟系统的系统。图17图示了用于从模拟系统转换到共享/租户系统的系统。图18示出了用于从共享/租户系统转换到标准系统的系统。图19示出了用于从模拟系统转换到标准系统的系统。图20示出了包括共享数据库容器和租户数据库容器两者中的对象的数据的系统。图21a-图21b示出了在数据库系统中部署对对象的改变的示例系统。图22示出了用于使用交换的共享数据库容器方法来升级多重租赁数据库系统的示例系统。图23示出了用于将新服务包部署到多重租赁数据库系统的示例系统。图24示出了用于数据库系统的维护的示例系统。图25示出了用于将多重租赁系统升级到新版本的示例系统。图26示出了使用交换的共享数据库容器方法的新数据库版本的部署之前的示例系统。图27-图31是通过交换的共享数据库容器而部分升级的示例系统的图示。图32示出了用于对对象部署改变的系统。图33示出了用于使用共享数据库容器的隐藏准备来部署补丁的系统。图34示出了在补丁的部署之前的示例系统。图35示出了在将补丁部署到数据库系统期间用于共享数据库容器的准备的系统。图36和图37示出了用于将补丁部署到租户数据库容器的系统。图38示出了用于执行部署的结束的系统。图39示出了使用共享数据库容器技术的隐藏准备的部署之后的系统。图40是用于处理不成功的租户部署的示例方法的流程图。图41示出了用于将多个补丁部署到数据库系统的系统。图42示出了用于在将多个补丁部署到数据库系统之前准备共享数据库容器的系统。图43-图47示出了用于将多个补丁部署到数据库系统的示例系统。图48示出了在完成将多个补丁部署到数据库系统之后的系统。图49是用于将不同类型的改变应用于多重租赁数据库系统的示例方法的流程图。图50是用于改变一个或多个表的共享类型的示例方法的流程图。图51是示出从第一表类型到第二表类型、不同表类型的转换的表。图52示出了包括处于第一版本的第一系统和处于第二版本、后来(later)版本的第二系统的系统。图53示出了各种表类型之间的转变。图54示出了用于在交换共享数据库容器时改变租户键的系统。图55是用于重新定向写入查询的示例方法的流程图。图56是用于键模式管理的示例方法的流程图。图57是用于在系统共享类型之间转换的示例方法的流程图。图58是用于交换共享数据库容器的示例方法的流程图。图59是用于修补共享数据库容器的示例方法的流程图。图60是用于对数据库系统部署不同类型的改变的示例方法的流程图。图61是用于改变键模式定义的示例方法的流程图。具体实施方式在多重租赁架构中,可以在不同客户的应用之间共享资源。每个客户可以被称为租户。所共享的资源可以包括例如供应商代码、应用文档以及中央运行时间和配置数据。多重租赁可以使能跨租户的多个应用实例之间的共享资源的改善使用,这可以减少磁盘存储和处理要求。多重租赁可以使能对事件的集中式软件改变管理,诸如修补或软件升级。内容分离方法可以用来将共享数据与租户专用数据分离。多重租赁方法可以应用于在没有数据分离的情况下被建立的现有应用作为设计准则。如果对现有系统实施多重租赁,则应用可以不变的执行。可以为应用提供关于所存储的数据的统一视图,该所存储的数据对应用隐藏哪些数据是共享的以及哪些数据是租户本地的。其他优点在下面更详细地讨论。图1是示出用于多重租赁的示例系统100的框图。具体地,所示系统100包括(或与下述可通信地耦合)数据库系统102、最终用户客户端设备104、管理员客户端设备105、应用服务器106和网络108。尽管分开示出,但是在一些实施方式中,两个或更多个系统或服务器的功能可以由单个系统或服务器提供。在一些实施方式中,一个所示的系统或服务器的功能可以由多个系统或服务器提供。例如,虽然被示出为单个服务器102,但是系统100可以包括多个应用服务器、数据库服务器、集中式服务服务器、或系统或服务器的一些其他组合。最终用户可以使用最终用户客户端设备104来使用作为由应用服务器106托管的服务器应用112的客户端版本的客户端应用110。在一些实例中,客户端应用110可以是可以访问所示数据的至少一部分或与其交互的任何客户端应用,包括网页浏览器、特定app(例如,移动app)、或另一合适的应用。服务器应用112可以存储和修改由数据库系统提供的表中的数据。这些表在数据字典114中定义,并驻留在共享数据库容器116和/或租户数据库容器118中,如下所述。服务器应用112可以使用数据库接口120来访问数据库管理系统119。数据库管理系统119可以提供包括可由多个应用提供者使用的公用的表集合的数据库。每个应用提供者可以被称为数据库系统的客户或租户。数据库系统102可以为每个租户存储租户专用数据。然而,由数据库系统102提供的至少一些数据可以是可以由多个租户共享的公用数据,诸如主数据或其他非租户专用数据。因此,公用的共享数据可以被存储在一个或多个共享数据库容器116中,并且租户专用数据可以被存储在一个或多个租户数据库容器118中(例如,每个租户可以具有至少一个专用租户数据库容器118)。作为另一示例,共享数据库容器116可以存储由应用的多个实例使用的公用数据,并且租户数据库容器118可以存储特定于每个实例的数据。数据拆分和共享系统122可以管理共享数据库容器116和租户数据库容器118之间的数据拆分。共享数据库容器116可以包括共享的、只读的表,所述表包括共享的数据,其中共享数据可以由多个租户作为公用数据集而使用。租户数据库容器118可以包括存储可以由给定租户修改的租户专用数据的可写入表。一些应用表(称为混合表或拆分表)可以包括在多个租户当中公用并共享的只读记录,以及可写入记录,该可写入记录是为特定租户添加的或者是在与系统的交互之前和/或交互期间可以由特定租户编辑的或为特定租户编辑的。混合表的只读记录可以被存储在共享的数据库容器116中的共享、只读部分中,而不是为每个租户存储单独的混合表。可以由给定租户修改的可写入混合表记录可以被存储在使用应用的每个租户的每个租户数据库容器118中的可写入部分中。可以跨不同类型的表拆分给定对象的数据。数据拆分和共享系统122可以使对象的公用部分能够被存储在共享数据库容器116中。数据字典114可以存储指示哪些表被共享(无论全部还是部分)的信息。服务器应用112可以被设计为不知道在数据库系统102中是否实施了多重租赁。服务器应用112可以使用相同的逻辑表名称集合向数据库系统102提交查询,而不管是否已经在数据库系统102中为给定租户实施多重租赁。例如,服务器应用112可以使用混合表的逻辑名称来提交查询,并且数据库系统102可以返回查询结果,而不管当多重租赁还没有实施时混合表是否是单个物理表、或者混合表是否在不同的数据库容器中被表示为多个表(包括只读部分和可写入部分)。由数据拆分和共享系统122实施的多重租赁特征可以允许应用被编程为使用单个逻辑表用于混合数据存储,同时仍允许在不同客户之间共享公用供应商数据。以前没有被设计用于数据共享和多重租赁的应用可以在多重租赁实施后保持不变。由多重租赁提供的数据共享可以减少应用部署的数据和内存占用。将混合表的数据存储在多个物理表中可以引入潜在的问题,诸如重复记录的可能性。约束执行系统126可以用来定义键模式,其描述哪些记录被允许存储在给定混合表的可写入部分中,该键模式可以用来防止重复记录。数据库接口120可以被配置为确定进入的查询是在数据库系统120中被表示为多个物理表的混合表的写入查询,并且作为响应,使用写入重新定向器128来确保写入查询只对混合表的写入部分操作。写入重新定向和键模式的使用可以有助于在应用操作期间和由部署工具130完成的内容部署期间数据一致性的执行。例如,可以使用部署工具130来在租户应用的安装之后为数据库系统102部署新的内容。例如,管理员可以使用管理员客户端设备105上的部署管理员应用132来启动部署。除了新数据之外,可以对应用的数据库系统102部署其他改变。例如,对于新的软件版本,可能会出现以下一种或多种情况:新内容、对内容的改变、内容删除、对表结构的改变、对共享哪些表以及不共享哪些表的改变、以及对定义哪些内容记录是共享的哪些是本地租户的键模式定义的改变。部署工具130可以使用改变管理系统134来确定如何进行每个所需的改变。改变管理系统134包括用于管理和进行不同类型的改变的基础设施。例如,改变管理系统包括用于管理表结构改变的结构改变基础设施136、用于管理对键模式的改变的拆分定义基础设施138以及用于管理对在租户当中共享哪些表的改变的共享类型改变基础设施140。改变管理系统134可以管理何时以及以何种顺序或组合来调用各个子基础设施。当部署用于升级或者新特征集时,可以出现对由应用使用的多个表的改变。部署工具130可以使用交换共享数据库容器116的方法,这可以比对现有的共享数据库容器116内联地进行改变更有效。共享数据库容器交换器142可以为部署工具130准备新的共享数据库容器116以进行部署。部署工具130可以将租户数据库容器118链接到新的共享数据库容器116。现有的共享数据库容器116可以在所有租户已经升级之后被丢弃。在升级过程中,部署状态可以存储在元数据144中。交换共享数据库容器116的方法可以允许租户单独升级——例如,每个租户可以在可以为每个租户定制的单独停机时间(downtime)窗口期间被链接到新的共享数据库容器116。如果一个租户的升级失败,那么可以重试该租户的部署,并且其他租户部署可以保持不受影响。新的共享数据库容器116的部署可以减少停机时间,因为新的共享数据库容器116可以在现有的共享数据库容器116的正在使用时的正常运行期间被部署。部署紧急补丁时,与更大的软件版本相比,可能会影响相对更少数量的表。部署工具130可以使用修补系统146来对现有的共享数据库容器116内联地进行必要的改变,而不是交换现有的共享数据库容器116。补丁的改变可以被部署到对租户初始隐藏的共享表中。这可以使租户能够被单独链接到隐藏表版本,其可以使能单独的租户专用的升级窗口和后备能力,类似于交换的共享数据库容器方法。修补系统146也可以使得补丁队列被应用。例如,第一补丁的部署可以针对租户集合进行,其中一些但不是所有租户应用了第一补丁。已经用第一补丁升级的租户可能会出现问题。可以开发第二个补丁来解决这个问题,第二个补丁可以应用于该租户。其他租户可以在稍后的时间用第一补丁(以及可能第二补丁)升级。应用系统或客户/租户的需求可能随时间而改变。用于客户集合的数据库初始可能相对小,并且可能不包括足够的数据来保证对该应用/数据库/客户的多重租赁的实施。例如,可以选择为该客户使用一个数据库容器,因为如果只使用一个数据库容器对比使用多个数据库容器,可以获得更高的性能。客户可以随着时间而增长、可以具有更大的数据库、可以运行更多的应用实例等等。特定的数据库可以由比过去更多的租户使用。当需求改变时,数据库系统102可以支持从一种类型的系统设置改变到另一种。例如,系统共享类型修改器148可以将数据库系统102从用于给定客户的标准设置(例如,没有多重租赁的一个数据库容器)改变为使用针对共享内容的共享数据库容器116和针对租户专用内容的租户数据库容器118的共享/租户设置。当测试对多重租赁的改变时,可以将模拟设置用于数据库系统102。系统共享类型可以作为系统设置被存储在元数据144中。部署工具130、数据库接口120、和数据拆分和共享系统122可以基于系统共享类型来更改行为。服务器应用112可以在不知道当前系统共享类型以及系统共享类型是否已经从一种类型改变为另一种类型的情况下运行。如在本公开中所使用的,术语“计算机”旨在包含任何合适的处理设备。例如,尽管图1示出了单个数据库系统102、单个最终用户客户端设备104、单个管理员客户端设备105和单个应用服务器106,但是系统100可以使用单个独立计算设备、两个或更多个数据库系统102、两个或更多个应用服务器106、两个或更多个最终用户客户端设备104、两个或更多个管理员客户端设备105等来实现。事实上,数据库系统102、应用服务器106、管理员客户端设备105和客户端设备104可以是任何计算机或处理设备,例如诸如刀片服务器、通用个人计算机(personalcomputer,pc)、工作站、基于unix的工作站或任何其他合适的设备。换句话说,本公开考虑了除了通用计算机以外的计算机以及没有传统操作系统的计算机。此外,数据库系统102、应用服务器106、管理员客户端设备105和客户端设备104可适应于执行任何操作系统,包括linux、unix、windows、macjavatm、androidtm、ios或任何其他合适的操作系统。根据一个实施方式,应用服务器106和/或数据库系统102还可以包括电子邮件服务器、web服务器、高速缓存服务器、流数据服务器和/或其他合适的服务器或者与上述服务器通信地耦合。由数据库系统102、应用服务器106、管理员客户端设备105和客户端设备104分别使用接口160、162、164和166来与被连接到网络108的分布式环境中的其他系统通信——包括在系统100内。通常,接口160、162、164和166每一个包括以合适的组合在软件和/或硬件中编码的逻辑,并且可操作来与网络108通信。更具体地,接口160、162、164和166每一个可以包括支持与通信相关联的一个或多个通信协议的软件,使得网络108或接口的硬件可操作以在所示系统100内部和外部通信传达物理信号。数据库系统102、应用服务器106、管理员客户端设备105和客户端设备104每一个分别包括一个或多个处理器170、172、174或176。处理器170、172、174和176中的每一个处理器可以是中央处理单元(centralprocessingunit,cpu)、刀片、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或另一合适的组件。通常,处理器170、172、174和176中的每一个处理器执行指令并操纵数据以执行各个计算设备的操作。不管特定的实施方式,“软件”可以包括计算机可读指令、固件、有线和/或编程硬件、或在被执行时可操作来执行本文描述的至少过程和操作的有形介质(适当地是暂时性的或非暂时性的)上的它们的任何组合。事实上,每个软件组件可以完全或部分地以任何适当的计算机语言来写入或描述,该计算机语言包括c、c++、javatm、visualbasic、汇编程序、任何合适版本的4gl以及其它。尽管图1中所示的软件的一部分被示出为通过各种对象、方法或其他过程来实施各种特征和功能的单独模块,但是软件可以适当地包括若干子模块、第三方服务、组件、库等。相反,各种组件的特征和功能可以适当地组合成单个组件。数据库系统102和应用服务器106分别包括存储器180或存储器182。在一些实施方式中,数据库系统102和/或应用服务器106包括多个存储器。存储器180和存储器182每一个可以包括任何类型的存储器或数据库模块,并且可以采取易失性和/或非易失性存储器(包括但不限于磁介质、光学介质、随机存取存储器(randomaccessmemory,ram)、只读存储器(read-onlymemory,rom)、可移动介质或任何其他合适的本地或远程存储器组件)的形式。存储器180和存储器182中的每一个可以存储各种对象或数据,包括高速缓存、类、框架、应用、备份数据、业务对象、作业、网页、网页模板、数据库表、数据库查询、存储业务和/或动态信息的存储库、以及包括与各个计算设备的目的相关联的参数、变量、算法、指令、规则、约束或对它们的引用的任何其他适当的信息。最终用户客户端设备104和管理员客户端设备105每一个可以是可操作来使用有线或无线连接来连接到网络108或在网络108中进行通信的任何计算设备。通常,最终用户客户端设备104和管理员客户端设备105中的每一个包括电子计算机设备,其可操作来接收、发送、处理、和存储与图1的系统100相关联的任何适当的数据。最终用户客户端设备104和管理员客户端设备105中的每一个可以分别包括一个或多个客户端应用,该客户端应用分别包括客户端应用110或部署工具132。客户端应用是允许客户端设备请求和查看客户端设备上的内容的任何类型的应用。在一些实施方式中,客户端应用可以使用在启动时接收到的参数、元数据和其他信息来访问来自数据库系统102的特定的数据集合。在一些实例中,客户端应用可以是在企业服务器(未示出)上运行的一个或多个企业应用的代理或客户侧版本。最终用户客户端设备104和管理员客户端设备105中的每一个通常旨在包含任何客户端计算设备,诸如膝上型/笔记本计算机、无线数据端口、智能电话、个人数字助理(personaldataassistant,pda)、平板电脑计算设备、这些设备内的一个或多个处理器、或者任何其他合适的处理设备。例如,最终用户客户端设备104和/或管理员客户端设备105可以包括计算机,该计算机包括诸如小键盘、触摸屏或可以接受用户信息的其他设备的输入设备,以及递送与数据库系统102或客户端设备本身的操作相关联的信息(包括数字数据、视觉信息)的输出设备,或分别包括图形用户接口(graphicaluserinterface,gui)190或192。gui190和gui192每一个与系统100的至少一部分对接用于任何合适的目的,包括分别生成客户端应用110或部署工具132的视觉表示。特别地,gui1902和gui192每一个可以被用于查看和导航各种网页。通常,gui190和gui192每一个为用户提供由系统提供或在系统内通信的业务数据的高效且用户友好的呈现。gui190和gui192每一个可以包括具有交互式字段、下拉列表和用户操作的按钮的多个可定制的框架或视图。gui190和gui192每一个考虑任何合适的图形用户接口,诸如通用网络浏览器、智能引擎和命令行接口(commandlineinterface,cli)的组合,其处理信息并有效地将结果视觉地呈现给用户。分别被包括在最终用户客户端设备104或管理员客户端设备105中的存储器194和存储器196每一个可以包括任何存储器或数据库模块,并且可以采取易失性或非易失性存储器(包括但不限于,磁性介质、光学介质,随机存取存储器(ram)、只读存储器(rom)、可移动介质或任何其他合适的本地或远程存储器组件)的形式。存储器194和存储器196每一个可以存储各种对象或数据,包括用户选择、高速缓存、类、框架、应用、备份数据、业务对象、作业、网页、网页模板、数据库表、存储业务和/或动态信息的存储库、以及包括与客户端设备104的目的相关联的任何参数、变量、算法、指令、规则、约束或对它们的引用的任何其他适当的信息。可以有与系统100相关联的或在系统100外部的任何数量的最终用户客户端设备104和管理员客户端设备105。此外,系统100的所示部分外部还可以存在一个或多个附加的客户端设备,其能够经由网络108与系统100交互。此外,,术语“客户端”、“客户端设备”和“用户”可以适当地互换使用,而不脱离本公开的范围。另外,虽然可以按照由单个用户使用来描述客户端设备,但本公开考虑许多用户可以使用一台计算机,或者一个用户可以使用多台计算机。数据拆分图2示出了具有标准数据库设置的应用的示例系统200。当执行从客户端应用接收的应用请求时,应用服务器202访问数据库204。数据库204可以是用于特定租户的数据库容器,例如或者是包括用于多个租户的数据的数据库。如分别由访问级别206、208和210指示的,对于特定租户,数据库204包括名为“tabr”的只读表212、名为“tabw”的可写入表214以及名为“tab”的混合表。尽管示出了只读、可写入和混合表类型中的每一个的一个表,但是给定租户可以具有这些表类型中的一些或全部的多个表。只读表212包括供应商交付的数据,诸如供应商代码、字符代码页、应用文档、中央运行时间和配置数据、以及其他供应商提供的数据。租户或与租户相关联的应用不在只读表212中写入或修改数据。从租户应用的角度来看,只读表212是只读的。可写入表214仅包括租户专用数据。可写入表214通常是被运送(shipped)空的,并且不包括供应商交付的数据。内容仅由与租户相关联的租户或应用写入可写入表214中。可写入表214可以包括例如业务交易数据。混合表216包括租户应用未修改的只读记录和可由租户应用修改的记录。混合表216可以包括供应商交付的数据和租户创建的数据。示例混合表可以是一个文档表,其包括运送的文档数据、租户添加的文档数据以及供应商提供但随后由租户修改的文档数据。例如,混合表216可以包括以各种语言用于用户接口显示中的默认文本值(其可以由特定租户定制)。在一些实施方式中,混合表216是包括已经由租户应用或客户添加的字段的可扩展表。图3示出了其中为多个、不同租户将相同内容存储在不同数据库容器中的示例非多重租赁系统300。系统300包括使用数据库接口306和308分别访问租户数据库容器314和316中的表310和表312的应用302和304。尽管应用302和304以及数据库接口306和308被单独示出,但是在一些实施方式中,在单个应用服务器上,应用302和304是相同的应用,数据库接口306和308是相同的数据库接口。表310和表312每一个是包括对多个租户公用的记录和对各个租户唯一(例如,由各个租户添加)的记录的混合表。例如,表310和表312都包括由供应商运送的公用记录(例如,记录318a-318b、320a-320b和322a-322b)。当各个应用302或304被部署用于各个租户时,这些公用记录可以被部署到表310和312。公用记录可以是不被各个应用改变的记录。与在一个共享位置存储公用记录相比,为每个租户单独存储公用记录会导致存储和维护成本的增加。如下所述,在实施多重租赁时,可以将公用、共享记录移动到共享表中。表310和表312每个还包括由各个租户应用302或304写入的记录,例如记录324a和324b(恰好具有相同的键)以及记录326和328和330,其仅在它们各自的表中。图4a示出了说明租户的数据的拆分的示例系统400。系统400可以用于内容分离——多个租户使用的共享内容与单个租户分别使用的租户专用数据的分离。系统400包括共享数据库容器402和用于给定租户的租户数据库容器404。表和视图名称只是说明性并且只是示例,可以使用任何表名称和任何表名称变体方案。共享数据库容器402包括由包括给定租户的多个租户使用的共享内容。共享内容可以包括供应商提供的内容,并且可以使能多个租户之间供应商交付的数据的共享。尽管被示为共享数据库容器402,但共享内容通常也可以存储在共享数据库中,或者通过使用共享数据库方案来存储。共享数据库容器402包括与图2的只读表212相对应的只包括只读记录的tabr表406。tabr表406被配置为对与租户数据库容器406相关联的给定租户、和其他租户只读且可共享。为给定租户运行的应用408可以提交指的是表名称“tabr”的查询。数据库接口(databaseinterface,dbi)410可以接收来自应用的查询,并向租户数据库容器404提交包括tabr表名称的查询。租户数据库容器404包括tabr视图412,该tabr视图412可以在查询被处理以用于对tabr表406的只读访问时使用。例如,使用远程数据库访问,tabr表406可以是从租户数据库容器404可访问的。作为另一示例,如果多个租户驻留在相同数据库中,则tabr表406可以驻留在与多个租户所驻留的数据库相同的数据库中。通常,每个租户可以具有其自己的数据库架构或容器,并且可以使用跨架构访问、跨容器访问或远程数据库访问来访问tabr表406。租户数据库容器404包括tabw表414,其在一些实例中对应于图2的可写入表214。tabw表414可以包括用于给定租户的非共享的或租户专用的应用数据。tabw表414可以是被运送空的表,响应于来自应用程序408的插入请求而将记录添加到给定租户的tabw表414。可替换地,tabw表414可以包括可以由租户或以租户专用的方式更新和修改的初始的数据集合。由应用408提交的插入查询可以包括tabw表名称,并且dbi410可以提供对tabw表414的写入访问,而不使用视图。应用408可以提交包括与图2的混合表216相对应的“tab”表名称的查询。当实施多重租赁时,来自混合表216的记录可以被拆分,以被包括在共享数据库容器402中包括的具有名称“/r/tab”的只读表416或者在租户数据库容器404中包括的具有名称“/w/tab”的可写入表418中。下面将更详细地讨论名称“/r/tab”和“/w/tab”的使用和识别。只读表416可以包括先前已经被包括在多个租户的多个租户表中的多个租户共同的记录。只读表416可以是多个租户用来访问公用数据和记录的共享存储库。可写入表418包括来自混合表216的特定于与租户数据库容器404相关联的给定租户的记录。具有与混合表216相同的名称tab的联合视图420为应用提供对只读表416和可写入表418的单个访问点408。在多重租赁的实施之前,应用408可能先前已经被配置为提交包括“tab”表名称的查询。在多重租赁的实施之后,应用408可以使用原始“tab”表名称继续提交查询,使用单个逻辑表名称来访问共同存储在可写入表418和只读表416中的混合记录。联合视图420提供关于混合记录数据的统一视图,其对应用408隐藏关于哪个数据是共享的以及哪个数据是租户本地的细节。对联合视图420执行的查询可以从只读表416、可写入表420或来自两个表的记录的组合中返回记录,并且应用420不知道从查询返回的记录的来源。联合视图420的使用使得多重租赁能够与诸如应用408的现有应用兼容——例如,应用408和其他应用可以继续被使用而无需修改。与应用知道可写入表418和只读表416并且需要修改来查询两个表而不是一个表相比,这种方法避免了应用的大量重写。包含对混合表的引用的查询和视图可以继续被使用而不需要修改。联合视图420的使用使得应用408能够使用单个查询来访问拆分到可写入表418和只读表416中的数据。dbi410可以被配置为确定包括tab表名称的查询是读取查询还是写入查询。如果查询是读取查询,则dbi410可以将读取的查询提交给租户数据库容器404,用于对联合视图420的读取操作。联合视图420提供对来自可写入表418和只读表416的联合数据的未改变的读取访问。如果查询是写入查询(例如,insert、update、delete、selectforupdate),则dbi410可以在向租户数据库容器404提交查询之前自动且透明地(从应用408的透视图)执行写入拦截操作,其可以包括将查询中的tab引用改变为“/w/tab”引用,其可以使得对可写入表418而不是联合视图420中的租户本地数据执行写入操作。由于写入访问被重新定向到可写入表418,所以对混合表的写入查询可以不变地由应用408提交。联合视图420可以被配置为只读的,使得如果尝试对联合视图420执行写入操作,则写入操作将被拒绝。如果对于联合视图420写入查询被允许接收,那么写入操作对于应该写入可写入表418中或只读表416中可能是模棱两可的。与为每个租户单独存储公用数据相比,tabr表406和只读表416中的共享内容的存储可以使得减少的存储器占用。将共同数据存储在共享位置可以减少生命周期管理过程期间的资源消耗,并简化这些过程。生命周期管理可以包括应用开发、打包、传输、安装和维护。将公用数据存储在一个位置可以简化软件改变管理、修补和软件升级。图4b示出了包括多个表类型中的每一个的多个表的示例多重租赁系统440。在多重租赁的实施之前,数据库系统可以具有只读、可写入和混合表类型中的每一个的多个表。例如,如表元数据441所示,表“tabr”、“tcpoo”和“tcp01”是只读表,表“tab”和“doktl”是混合表,表“tabw”、“acdoca”和“matdoc”是读取/写如(例如,可写入)表。如元数据444所示,表元数据可以存在于共享数据库容器442中和/或可以存在于租户数据库容器443中。如只读表445、446和448所示,多重租赁的实施可以使得将只读表包括在共享数据库容器442中。可以为只读表444、446和448在租户数据库容器443中分别创建只读视图450、452和454,以提供对应用456的读取访问。如可写入表458、460和462所示,多重租赁的实施可以使得将可写入表包括在租户数据库容器443中。每个混合表可以被拆分为共享数据库容器442中的只读表和租户数据库容器443中的可写入表。例如,只读表“/r/tab”464和可写入表“/w/tab”466替换混合表“tab”。作为另一示例,只读表“/r/doktl”468和可写入表“/w/doktl”470替换混合表“doktl”。在一些实施方式中,部署工具自动生成替代混合表的只读和可写入表的名称。所生成的名称可以包含被附加到混合表名称的前缀。前缀可以是预定的(例如,“/r/”,“/w/”)或者可以使用前缀查找来识别。例如,可以调用apigetsharedprefix472和gettenantprefix474,并且可以分别为共享前缀返回“/r/”,为可写入(例如租户)前缀返回“/w/”(或其他字符串)。例如,api472和474可以在预先配置的表中查找各个前缀。在一些实施方式中,使用了使用后缀或其他方法的不同命名方案以生成表称。在一些实施方式中,其他api可以生成并返回完整的共享表名称或完整的可写入表名称,而不是共享前缀或租户前缀。对于每个混合表,在租户数据库容器443中创建联合视图,该联合视图向应用456提供对与混合表相对应的只读表和可写入表中的记录的单个访问点。例如,联合视图476提供对只读表464和可写入表466的统一访问。作为另一示例,联合视图478提供对只读表468和可写入表470的统一访问。图4c示出使用后缀表命名方案的示例多重租赁系统480。如注释482所示,被包括在共享数据库容器488中的只读表484、485、486和487可以包括使能若干版本的表的存储的后缀。只读视图489提供对只读表485的读取访问,该只读表485是给定只读表的当前配置版本(例如,“tabr#2”)。为了获得对给定只读表的不同版本(例如,“tabr#1”)的访问,只读视图489可以被重新配置为与只读表487相关联。多个版本的表可以在升级的部署期间使用,如下面更详细描述的。如注释490所示,可以在租户数据库容器494中包括只读视图492,诸如如果应用496需要对被运送的、只读内容的读取访问,则之前被包括在混合表中的只读内容现在被存储在只读表484中。联合视图498可以提供对只读视图492和现在被包括在可写入表499中的可写入混合表记录的统一访问。只读视图492可以被重新配置为访问作为只读表484的不同版本(例如“tab#2”)的表486。图5示出了包括共享数据库容器502、第一租户的第一租户数据库容器504、以及第二租户的第二租户数据库容器506的示例系统500。第一应用508和和第二应用510分别处理对第一租户和第二租户的应用请求。第一租户和第二租户可以由单独的应用服务器或相同的应用服务器或由多个应用服务器服务。共享数据库容器502包括共享只读表512,其包括只读运送记录。共享只读表512作为共享表被使得可用于第一租户和第二租户以及其他租户。第一应用508和第二应用510可以分别使用视图514或视图516来访问共享只读表512。第一应用508和第二应用510可以分别通过视图514或视图516具有对共享只读表512的读取访问,而不是写入访问。第一租户数据库容器504和第二租户数据库容器506分别包括可写入表518或520。可写入表518和520彼此分离,并且存储已经分别由应用508或应用写入的记录510。第一租户不能访问可写入表520,相应地,第二租户不能访问可写入表518。共享数据库容器502包括共享只读表522,该共享只读表522存储已经被包括在混合表中的共享只读记录。被包括在第一租户数据库容器504和第二租户数据库容器506中的可写入表524和526存储已经或将要由应用508或应用510分别添加到可写入表524或可写入表526的混合表记录。可写入表524和526彼此分离。第一租户不能访问可写入表526,相应地,第二租户不能访问可写入表524。应用508可以被提供对混合表记录的单个访问点,现在使用联合视图528在共享只读表522和可写入表524之间拆分该混合表记录。类似地,应用510可以被提供对混合表记录的单个访问点,现在使用联合视图530在共享只读表522和可写入表526之间拆分该混合表记录。如以上对图4的描述,由应用508或应用510提交的对tab表的写入请求可以被各个dbi拦截并分别被重新定向到可写入表524或可写入表526。图6示出了包括共享数据库容器602、第一租户的第一租户数据库容器604、和第二租户的第二租户数据库容器605的示例系统600。应用606和607被配置为分别使用dbi610或dbi611访问联合视图608或联合视图609以获得对各个混合表的访问。联合视图608和609分别为应用606或应用607提供对先前被存储在名为tab的混合表(诸如图3的混合表310)中的记录的单个访问点。如对联合视图608所示的,tab表和联合视图608和609包括第一键区612、第二键区614、第一数据区616和第二数据区618。联合视图608(并且因此只读表620和可写入表623)的主键可以包括第一键区612和第二键区614。第一键区612和/或第二键区614可以是由数据库使用但未呈现给最终用户的技术区。现在将多个租户共有的混合表的只读记录存储在共享数据库容器602中的共享只读表620中。共享只读表620包括与多个租户共享或多个租户共同的只读记录。例如,共享只读表620包括与图3的记录318a-318b、320a-320b和322a-322b相对应的记录624、626和628。现在将为第一租户或第二租户添加的混合表记录存储在第一租户数据库容器604中的可写入表622中或第二租户数据库容器605中的可写入表623中。可写入表622包括特定于第一租户的记录,该记录包括与图3的记录324a和330相对应的记录630和632。类似地,可写入表623包括特定于第二租户的记录,该记录包括与图3的记录324b、326和328相对应的记录634、636和638。来自应用606的、从联合视图608检索所有记录的查询可以返回记录624、626、628、630和632。来自应用607的、从联合视图609检索所有记录的查询可以返回记录624、626、628、634、636和638。记录630和632不可以由第二租户访问。记录634、636和638不可以由第一租户访问。键模式管理图7示出了用于约束执行的系统700。系统700包括共享数据库容器702和租户数据库容器704。名为“tab”的混合表已经被拆分为共享数据库容器702中的只读表706(“/r/tab”)和租户数据库容器704中的可写入表708(“/w/tab”)。当将数据存储在两个表而不是一个表中时,数据库的主键约束可能不再有效。一旦混合表被拆分,并且没有进一步的配置,只读表706中的记录可以具有与可写入表708中的记录相同的键值。例如,初始由供应商提供的只读表706中的记录可以具有与由租户应用写入的可写入表708中的记录相同的键。作为另一示例,供应商可以在安装后将作为租户写入的记录已经存在于可写入表708中的记录部署到只读表706。重复记录的存在会产生不希望的问题。例如,应用710可以被配置为使用dbi712提交针对具有对主键区的限制的“tab”表的选择查询,其中该查询被设计成返回一个记录(例如,如果找到与主键限制匹配的记录)或者不返回记录(例如,如果没有找到与主键限制匹配的记录)。然而,如果允许重复记录存在于只读表706和可写入表708之间,则这样的选择查询可以返回两个记录,因为查询可以对具有名称“tab”的提供对只读表706和可写入表708的统一访问的联合视图714执行。应用710可能没有被正确地配置来处理这种情况,并且可能发生错误情况、不希望的应用行为和/或不希望的数据修改。作为另一示例,应用710可以提交具有对主键区的限制的删除查询,期望查询唯一地识别要删除的记录。对删除查询的限制可以在被应用于联合视图714时匹配两个纪录,因此可能存在关于要删除哪个记录的歧义。为了解决与重复记录的可能性有关的问题,可以识别描述可以由应用710写入并因此存在于可写入表708中的记录的键模式。例如,可以存在键值约定,使得只读表706中的被运送的记录具有特定的键模式,诸如键值的第一范围,并且添加具有不同键模式的应用添加的记录,诸如键值的第二、不同范围。作为另一示例,运送记录可以具有包括特定前缀的键值,并且可以使用包括不同前缀的键值来添加租户添加的记录。可以使用键值约定来定义不同的键值空间——例如,用于运送记录的第一键值空间、和用于租户记录的第二、不同键值空间。租户键表716可以用来定义键模式。例如,租户键表716中的行718包括用于表名称列720的值“tab”,其指示正在为联合视图714(以及为包括“tab”表引用的应用请求)定义键模式。行718在活动/非活动列722中包括“a”(“活动”)的值,指示“tab”表的键模式是活动的。下面更详细地描述活动和非活动的键模式。where子句列724的在记录718中的值“kf1likez%”定义“tab”表的键模式。键模式描述被包括在可写入表708中的记录的键的模式(例如,键模式指示可写入表708中的记录应该具有以“z”开头的键)。键模式的补充(例如“notkf1likez%”(例如,具有不以“z”开头的键的记录))描述了只读表706中的记录的模式。dbi712可以使用键模式来确保存储在可写入表708中的记录的键与存储在只读表706中的记录的键不相交。dbi712可以被配置为通过检查从应用710接收的针对“tab”表的写入查询(例如,更新,插入,删除查询)、接受(并执行)与键模式一致的(例如,如上所述,在可写入表708上使用重新定向写入的)查询、并且拒绝与键模式不一致的查询来禁止复制的记录。不一致的查询将添加或修改可写入表708中的记录,使得记录不匹配键模式。dbi712可以被配置为在键模式检查期间拒绝这种不一致的查询(并且可能针对这种不一致的查询发出运行时错误),以确保写入查询仅被应用于可写入表708而不是只读表706。尽管描述为由dbi712执行,但可以在别处执行键模式检查,诸如通过应用于可写入表708和/或只读表706的附加表约束对象、数据库触发器或一些其他数据库组件。dbi712可以被配置为检查诸如引用值的范围的查询的复杂查询以确保修改符合键模式定义。虽然示出了where子句语法,但是可以使用其他类型的定义来定义键模式。虽然租户键表716被图示为被包括在租户表704中,但是租户键定义也可以或可替换地存在于共享数据库容器702中,如租户键表726所示。租户键定义可以存在于共享数据库容器702中,使得应用710或租户用户不能够改变租户键定义。例如,可以在租户数据库容器704中包括视图(未示出)以提供对租户键表726的读取访问。如果租户键被包括在共享数据库容器702中,则如果多个租户各自具有相同的键模式定义,则可以与多个租户共享租户键定义。如果一些租户具有不同的键模式定义,则被包括在共享数据库容器702中的租户键定义可以(例如,使用租户标识符列或一些其他标识符)与(多个)特定租户相关联。与重复记录问题的其他替代方法(诸如允许重复记录的覆盖方法)相比,使用键模式可能是有利的。利用覆盖方法,可以使用(与联合视图714相比)更复杂的联合视图,其涉及使用优先级算法来在跨可写入表708和只读表706具有相同键的多个记录当中选择一个记录。然而,这样的方法并不能解决选择查询能够返回与刚被删除的记录具有相同键的记录的问题(例如,删除可能已经删除了一个而不是跨不同表存储的两个重复记录)。可以使用一种方法来存储本地删除,以便稍后滤出已经在本地删除的共享数据,但是该方法增加了复杂性并可能影响性能。此外,因为针对重复记录可能必须分析租户内容,所以如果共享内容被更新,则升级过程可能包括复杂性,并且可能必须作出关于是否由于与新运送内容的冲突而将租户本地记录移除的决定。作为用于避免重复记录的替代方法的另一示例,系统700可以在可写入表中的每个改变操作之后针对只读表执行检查。但是,这种方法可能会导致不可接受的性能下降。使用键模式而不是这些可替换方法可以避免复杂性和性能问题。在初始系统部署期间,可以使用键模式来根据键模式定义来拆分混合表数据。在安装共享数据库容器702时,系统700可以确保只读表706中的内容不匹配定义被包括在可写入表708中的数据的键模式。类似地,在安装租户数据库容器704(和其他租户数据库容器或数据库)时,系统700可以确保在可写入表708中不包括与键样式不匹配的内容。键模式可以在其他生命周期阶段使用,如下所述。图8示出了用于部署与所配置的租户键一致的内容的示例系统800。通常,在系统生命周期期间,强制执行键模式定义,以确保租户不会写入与当前共享数据冲突或写入将来可能被递送用于共享的数据冲突的数据。除了系统安装和应用执行之外,键模式定义还会在系统生命周期的其他阶段(诸如数据部署)强制执行。当供应商运送新的内容或内容更新时(诸如在更新或升级期间),将考虑内容分离和键执行,以确保供应商在软件生命周期事件期间将内容递送给共享容器不会创建与在租户容器中创建的数据的冲突。例如,可以将包含要被部署到系统800的新记录的文件802提供给内容部署工具804和内容部署工具806,分别用于到共享数据库容器808和租户数据库容器810的部署。例如,文件802可以包括作为应用或数据库的新版本的结果而被添加到系统800的记录。内容部署工具804和806可以分别使用dbi812或dbi814以将内容分别写入共享数据库容器808或租户数据库容器810。尽管被示为单独的内容部署工具804和806以及单独的dbi812和814,但是在一些实施方式中,内容部署工具804和806是相同的工具和/或dbi812和814是相同的接口。内容部署工具804可以使用dbi812从租户键表820中读取与“tab”混合表相关联的只读“/r/tab”表818的where子句816。where子句816描述在租户数据库容器810中的“/w/tab”可写入表822中存在的键的模式,可写入表822也与“tab”混合表相关联。内容部署工具804可以确定文件802中的哪些记录不匹配where子句816,并且可以使用dbi812将来自文件802的不匹配where子句816的记录写入只读表818,如注释824所示。与where子句816不匹配的记录可以是要在租户之间共享的并且不由各个租户修改的记录。例如,如注释826所示,基于“ww”键值与“kf1likez%”的where子句816不匹配,内容部署工具804可以从文件802读取具有“kf1”键列828的值“ww”的记录,并将其写入只读表818。dbi812和/或只读表818可被配置为允许由内容部署工具804将内容写入只读表818,即使只读表818相对于dbi830从应用832接收到的请求是只读的。例如,dbi830和/或联合视图834可以被配置为允许(通过联合视图834)读取但不写入对只读表818的请求。dbi830可以是与dbi812和/或dbi814相同或不同的dbi。内容部署工具806可以使用dbi814从租户键表838读取与“tab”混合表相关联的可写入“/w/tab”表822的where子句836。尽管显示为与租户键表820分离,但租户键表838可以是与租户键表820相同的表,并且可以存在于共享数据库容器808中、租户数据库容器810中或另一位置中。当内容部署工具806是与内容部署工具804相同的工具时,由于where子句816可能已经被内容部署工具806读取并且可以被其使用,因此可以不执行对where子句836的单独读取。类似于where子句816,where子句836描述存在于“/w/tab”可写入表822中的键的模式。内容部署工具806可以确定文件802中的哪些记录与where子句836匹配,并且可以将来自文件802的与where子句836匹配的记录写入可写入表822,如注释840所示。例如,如注释842所示,基于与where子句836匹配的“zz”键值,具有键值“zz”的记录可以被写入可写入表822。文件802中与where子句836匹配的记录可以是随后可以由与租户容器810相关联的租户修改的记录。如上所述,文件802可以包括要被写入只读表818和可写入表822的数据。作为另一示例,内容部署工具804和/或内容部署工具806(或另一组件)可以创建用于内容递送的两个文件——例如,用于可写入表822的一个文件和用于只读表818的一个文件。当使用单独的文件时,内容部署工具806可以忽略用于可写入表822的文件中的与键模式不匹配的记录,或者可以为这样的记录发出错误。类似地,内容部署工具804可以忽略用于只读表818的文件中与键模式相匹配的记录,或者可以为这样的记录发出错误。在下面的其他章节中更详细地描述内容部署。图9示出了用于改变租户键的示例系统900。例如,当应用和/或数据库的新版本被发布时,可以改变租户键。例如,应用开发人员可以改变可以由租户应用写入的键值的范围。作为另一示例,数据库系统可能已经在执行应用的当前版本或先前版本期间检测到利用与当前键模式不匹配的键来写入记录的尝试。开发人员或管理员可以查看这些尝试的日志,并确定将来允许用这些键写入记录。租户数据库容器907中的租户键表906中的当前记录904具有“a”(“活动”)的值908,其指示当前记录904中的where子句910是可写入表902中的记录的键值的当前配置描述。例如,“kf1likez%”的where子句910指示可写入表902中的键值以字母“z”开头。管理员可能希望改变租户键表906,使得在可写入表902中允许具有以“z”或“y”开头的键值的记录。包括新的where子句的文件912(或其他电子数据输入)可被提供给约束改变工具914。约束改变工具914可使用dbi916向包括在文件912中包括的新where子句的租户键表添加记录918。例如,添加记录918中包括新where子句920“kf1likez%orkf1likey%”。添加记录918包括活动/非活动值922“i”,其表示“非活动”。如下所述,在共享数据库容器926中的可写入表902和只读表924已被更新为符合新的where子句920之后,可以将添加的记录918标记为活动的。如上所述,租户键可存在于租户数据库容器907(如租户键表906所示)中和/或共享数据库容器926(如租户键表928所示)中。约束改变工具930(其可以是与约束改变工具914相同或不同的工具)可以使用dbi931向租户键表928添加具有新的where子句的新记录932,如上面针对添加记录918所描述的。dbi931可以是与dbi916相同或不同的接口。图10示出了用于更新数据库记录以符合经更新的租户键的示例系统1000。经更新的租户键由租户键表1006中包括的非活动记录1004中包括的新where子句1002来描述。非活动记录1004是活动租户键记录1008的替换记录。如下面更详细描述的,约束改变工具1010可以更新共享数据库容器1014中的只读表1012和租户数据库容器1016中的可写入表1015中的记录以符合新的where子句1002。约束改变工具1010可以使用dbi1020从非活动的租户键记录1004中读取新的where子句1002(例如,如注释1022所示)。约束条件改变工具1010可以使用dbi1020从与新的where子句1002相匹配的只读表1012中删除记录。例如,如注释1024所示,具有键值“yy”(例如,被包括在图9的只读表924中)的记录已经从只读表1012中删除,并且不再被包括在只读表1012中。例如,具有键值“yy”的记录可以由于记录与被包括在活动租户键记录1008中的先前的where子句“kf1likez%”不匹配而先前已经被允许处于只读表924中。约束改变工具1026(其可与约束改变工具1010相同或不同)可使用dbi1029(其可与dbi1020相同或不同)来从可写入表1015中删除与where子句1002不匹配的记录。约束改变工具1028可以从租户键表1006读取where子句1002,或者可以从租户数据库容器1016中的租户键表1034中的非活动租户键记录1032读取where子句1030。where子句1030描述了以“z”或“y”开头的键的键模式。由于可写入表1015中的两个记录都具有以“z”开头的键(例如,在可写入表902中不存在与where子句1030不匹配的记录),可写入表1015与图9的可写入表902相同(例如,没有记录已被删除)。在从可写入表1015中删除了与where子句1030不匹配的任何记录并且从只读表1012中删除了与where子句1002匹配的任何记录之后,约束改变工具1010(和/或约束改变工具1028)可以读取包括指示要在只读表1012和可写入表1015之间移动的数据的信息的文件1036,以完成对系统1000的更新以符合经更新的租户键。下面更详细地描述文件1036的处理。在一些实施方式中,不是使用文件1036来存储要在只读表1012和可写入表1015之间移动的数据,而是约束改变工具1010可以查询只读表1012和/或可写入表1015以提取要被移动的记录。例如,约束条件改变工具1010可以提交“插入到/w/tab(从其中(kf1likez%orkf1likey%)的/r/tab选择*)的查询,以将与新的where子句1002相匹配的记录从只读表1012移动到可写入表1015。作为另一示例,约束条件改变工具1010可以提交“插入到/r/tab((从其中非(kf1likez%orkf1likey%)的/w/tab选择*),以将与新的where子句1002不匹配的记录从可写入表1015移动到只读表1012。然而,在一些实施方式中,不从可写入表1015中选择内容用于包括在只读表1012中,因为租户可能已经修改了可写入表1015中的数据。图11示出了用于使用传输文件1102来更新数据库记录以符合经更新的租户键的示例系统1100。传输文件1102对应于文件1036并且包括要在共享数据库容器1106中的只读表1104以及租户数据库容器1110中的可写入表1108之间移动的数据。约束改变工具1112可以从传输文件1102读取与租户键表1118中的非活动记录1116中包括的where子句1114不匹配的记录。约束改变工具1112可以使用dbi1120来将来自传输文件1102的与where子句1114不匹配的记录部署到只读表1104。在图11的示例中,在传输文件1102中没有与where子句1114不匹配的记录,所以没有新的记录被部署到只读表1104。约束改变工具1122(其可以与约束改变工具1112相同或不同)可以从传输文件1102读取与where子句1114匹配的记录。约束改变工具1122可以从租户键表1118读取where子句1114或者可以从租户数据库容器1110中的租户键表1128中的非活动租户键记录1126读取where子句1124。约束改变工具1122可以使用dbi1130(其可以dbi1120相同或不同)来将来自传输文件1102的与where子句1114匹配的记录部署到可写入表1108。在图11的示例中,具有键值“yy”的记录(与where子句1114相匹配)被包括在传输文件1102中,并被部署到可写入表1108,如记录1132和注释1134所示。如下所述,在传输文件1102已经被部署到可写入表1108和/或只读表1104之后,非活动记录1116被改变为在租户键表1118中的活动记录。图12示出了用于更新非活动的租户键记录的示例系统1200。约束改变工具1202可以更新共享数据库容器1206中的租户键表1204。在一些实施方式中,附加地或可替代地,约束改变工具1208对租户数据库容器1212中的租户键表1210进行类似的改变。约束改变工具1202可以向dbi1216提交删除查询1214以删除租户键表1204中的一个或多个活动条目。例如,空的(经删除的)条目1218表示图10的现在删除的活动租户键记录1008。约束改变工具1202可以向dbi1216提交更新查询1219,以将先前非活动的租户键记录(例如,图10的非活动租户键记录1004)改变为活动租户键记录,如由包括表示“活动”的值“a”的经更新的租户键记录1220。例如,非活动的租户键记录可以在部署过程期间被标记为非活动,并且在部署过程已经完成时可以被标记为活动。一旦经更新的租户键记录1220是活动的,租户应用就可以写入与在现在活动记录中包括的where子句1222匹配的新记录。例如,租户应用可以将具有键值“y1”的记录写入租户数据库容器1212中的可写入表1224,如新的记录1226和注释1228所示。下面将更详细地描述租户键的更新以及其他类型的部署改变。系统共享类型如上所述,可以支持不同的系统共享类型,诸如其中未实施多重租赁的标准系统设置和实施多重租赁的共享/租户设置。可以支持系统共享类型之间的转换,而系统共享类型的改变对应用是透明的。图13a示出了包括具有标准系统共享类型的标准系统1302和具有共享/租户系统共享类型的共享/租户系统1304的示例系统1300。标准系统1302包括全部被包括在单个数据库容器1312中的只读表“tabr”1306、可写入表“tabw”1308和只读的本地写入表“tab”1310。在部署期间,部署工具1314可以将数据部署到表1306、1308和1310中的每一个。表1306、1308和1310是说明性的。标准的系统共享类型系统可以包括不同表类型的表的其他组合,包括给定类型的表的多个实例。例如,标准系统共享类型系统1302可以包括多个只读表、多个可写入表、和/或多个只读的本地写入表。共享/租户系统1304包括共享数据库容器1316和租户数据库容器1318。如上所述,共享数据库容器1316包括对应于只读表1306的只读表1320,并且租户数据库容器1318包括对应于可写入表1308的可写入表1322。共享数据库容器1316中的只读表1324和租户数据库容器1318中的可写入表1326对应于只读的本地写入表1310。视图1328提供对只读表1320的读取访问,并且联合视图1330提供对只读表1324和可写入表1326的统一访问。在部署期间,部署工具1332可以将数据部署到被包括在共享数据库容器1316中的只读表1320和只读表1324。部署工具1334可以将数据部署到被包括在租户数据库容器1318中可写入表1322和可写入表1326。虽然被示为两个单独的部署工具,但是在一些实施方式中,部署工具1332和部署工具1334是相同的工具。图13b是示出可以针对标准数据库容器1352、共享数据库容器1354和租户1356数据库容器执行的处理的表1350。多重租赁系统中的处理类型可以包括数据库(db)对象创建1358、db内容部署1360和应用1362的写入操作。例如,如单元1364中所述,只读(read-only,ro)、可写入(writable,rw)和混合(ro+wl)表可以在标准数据库容器1352中创建。单元1366指示只有可共享的对象,诸如只读表或混合表的只读部分(例如,在混合表被拆分时创建的只读表)被创建在共享容器1354中。单元1368指示本地表(例如,对给定租户是本地的)被创建在租户数据库容器1356中。例如,租户数据库容器1356可以包括可写入表(rw)和混合表(例如,ro+wl,具有名称/w/tab,诸如当混合表被拆分时创建的可写入表)的可写入部分。租户容器1356还可以包括到共享容器1354中的只读表的视图以及关于混合表的只读和可写入部分的联合视图。单元1370指示部署工具可以将内容部署到被包括在标准数据库容器1352中的所有表。部署工具可以将内容部署到共享数据库容器1354中的共享表(例如,只读表或混合表的只读部分),如单元1372所示。单元1374指示部署工具可以将内容部署到租户数据库容器1356中的本地表。对混合表的部署可以包括将表写入重新定向到混合表的可写入部分。租户申请人可写入标准数据库容器1352中的所有对象(例如,如单元格1376中所述)。单元1378指示租户应用不被允许写入共享数据库容器1354中的表。单元1380指示租户应用可以将内容写入租户数据库容器1356中的本地表,包括可写入表和混合表的可写入部分。在混合表上的应用写入可以被重新定向到混合表的可写入部分。图14示出了用于从标准系统1401转换到共享/租户系统1402的系统1400。标准系统1401包括数据库容器1403,其包括只读表1404、可写入表1405和混合表1406。数据库容器1403可以与租户相关联并且为了讨论的目的而具有“租户”的名称。如流程图1407所述,可以执行转换以将租户的标准系统1401转换到共享/租户系统1402。在1408处,创建共享数据库容器1410,以被包括在共享/租户系统1402中。被包括在标准系统1401中的数据库容器1403可以被用作共享/租户系统1402中的租户数据库容器1414。也就是说,数据库容器1403是转换前的图示,并且租户数据库容器1414是用于租户的租户数据库容器的转换后的图示。在1416处,将对共享数据库容器1410的访问许可给与租户相关联的租户数据库用户。在1418处,在共享数据库容器1410中创建只读表1420(例如,具有路径/名称“shared./r/tabr”)。在1422处,将数据从被包括在数据库容器1403中的只读表1404(例如,具有路径/名称“tenant.tabr”的表对象)复制到只读表1420(例如,“shared./r/tabr”)。在1424处,丢弃只读表1404(例如,“tenant.tabr”)。因此,在转换的结束处,只读表1404不被包括在租户数据库容器1414中。在1426处,在租户数据库容器1414中创建视图1428(例如,“tenant.tabr”),以提供对只读表1420的读取访问。在1430处,在共享数据库容器1410中创建只读表1432(例如,“shared./r/tab”)。在1434处,将与为租户内容定义的键模式不匹配的数据从混合表1406(例如,“tenant.tab”)复制到只读表1432(例如,“shared./r/tab”)。换句话说,要在租户之间共享并且不是租户专用的数据从混合表1406复制到共享数据库容器1410中的只读表1432。在1436处,从混合表1406(例如,“tenant.tab”)删除与为租户内容定义的键模式不匹配的数据(例如,在操作1434中复制的数据)。在1438处,混合表1406(例如,“tenant.tab”)被重命名为“tenant./w/tab”,以作为可写入表1440被包括在租户数据库容器1414中,用于存储租户专用内容。保留在可写入表1440中的记录应该是与为租户内容定义的键模式匹配的记录。在租户数据库容器1414中包括未修改的可写入表1405,作为可写入表1442,用于存储转换后租户内容。在1444处,对只读表1432(例如,“shared./r/tab”)和可写入表1440(例如,“tenant./w/tab”)创建联合视图1446(例如“tenant.tab”),以提供对只读表1432和可写入表1440的统一访问。由于跨数据库容器访问和数据移动以及其他问题,从标准系统1401直接到共享/租户系统1402的转换可能花费比在一些实例中期望的更多的时间。在一些实施方式中,不能简单地重命名数据库对象以将数据库对象从一个数据库容器移动到另一数据库容器。改变哪些表是只读的、混合的或可写入的,以及键模式的改变,都会导致数据和表移动。例如,将表改变为只读或混合可以导致将数据从租户数据库容器移动到共享数据库容器。为了提高应用的开发和测试期间的性能,在最终部署之前,可以使用仿真模式来模拟针对应用和内容部署的数据共享。模拟模式涉及将所有数据库对象存储在一个数据库容器中,并模拟只读/共享访问,并为适当的数据库对象重新定向写入操作。使用一个数据库容器可以使能数据库对象的重命名以模拟到共享系统设置的转换。如果应用按照仿真模式中所预期的来执行,则可以执行转换以将数据库系统从仿真模式转换到共享系统设置。如以下在图15-图17中讨论的,将数据库系统从标准系统设置转换到模拟模式并且将数据库系统从模拟模式转换到共享系统设置包括比将数据库系统从标准系统设置直接转换到共享系统设置更多的ddl(datadefinitionlanguage,数据定义语言)语句和更少的dml(datamanipulationlanguage,数据操纵语言)语句。图15示出了具有模拟的共享类型的系统1500。部署控制系统1502可以使用部署工具1504来通过将数据导入到仿真数据库容器1505来模拟租户的数据的导入。例如,部署工具1504可以使用dbi1506来将数据部署到被包括在仿真数据库容器1505中的可写入的表1508和可写入表1510。部署控制系统1502可以使用部署工具1514(其可以是与部署工具1504相同或不同)以通过将数据导入模拟数据库容器1505来模拟共享数据的导入。例如,在模拟中,部署工具1514可以使用dbi1516(其可以是与dbi1506相同或不同的接口)来将共享数据部署到被包括在相同模拟数据库容器1505中的只读表1518和只读工具1520,模拟数据库容器1505也包括可写入表1508和可写入表1510。视图1522提供对只读表1520的读取访问。联合视图1524提供对只读表1518和可写入表1508的统一访问。共享模式的模拟可以通过以下来完成:禁用、使用dbi1526、对诸如只读表1518的只读表的应用写入访问,将针对联合视图1524接收到的应用写入查询重新定向到可写入表1508,如果要修改的记录匹配所定义的键模式,则使用只读视图1522来提供对只读表1520的应用读取访问,并使用联合视图1524来提供对只读表1518(和可写入表1508)的应用读取访问。图16示出了用于从标准系统1602转换到仿真系统1604的系统1600。在流程图1606中描述了从标准系统1602到仿真系统1604的转换。在1608处,被包括在数据库容器1612中的只读表1610从“tabr”重命名为“/r/tabr”,如由模拟数据库容器1616中的只读表1614所示的。被包括在标准系统1602中的数据库容器1612可以用作模拟系统中的模拟数据库容器1616。也就是说,数据库容器1612是转换前的图示,而模拟数据库容器1616示出转换后的容器内容。在1618处,对只读表1614创建视图1620。在1622处,被包括在数据库容器1612中的“tab”混合表1624被重命名为“/r/tab”,如由被包括在模拟数据库容器1616中的混合表1626所示。在1628处,在模拟的数据库容器1616中创建混合“/w/tab”表1630。在1632处,根据租户内容定义将数据从只读表1626移动到可写入表1630。例如,将与为租户内容定义的键模式匹配的租户专用数据从只读表1626移动到可写入表1630。在1634处,对只读表1626和混合表1630创建联合视图1636。被包括在数据库容器中的可写入表1638保持被包括在仿真数据库容器1616中,如可写入表1640所示。图17示出了用于从仿真系统1702转换到共享/租户系统1704的系统1700。仿真系统1702包括模拟容器1706,其包括只读表1708、只读表1710、可写入表1712、对只读表1708的视图1714、对只读表1710和可写入表1712的联合视图1716以及可写入表1717。在流程图1718中描述了从模拟系统1702到共享/租户系统1704的转换。在1720处,只读“/r/tabr”表1708被移动到被包括在共享/租户系统1704中的共享容器1722,如只读表1724所示。在1726处,如租户容器1728中所示,针对只读表1724(例如,“shared./r/tabr”)重新创建视图1727。例如,视图1714可能变得无效或当只读表1708被移动时被删除。租户容器1728是模拟容器1706的转换后视图。即,一旦转换已经完成,模拟容器1706就可以用作租户的容器,租户容器1728是示出转换的完成之后的容器内容的图示。在1730处,将只读“/r/tab”表1710从模拟容器1706移动到共享容器1722,如只读表1732所示。在1734处,对只读表1732和对应于可写入表1712的可写入表1738重新创建联合视图1736。例如,联合视图1716可能变为无效或在只读表1710被移动到共享容器1722时被删除。可写入表1740对应于可写入表1717(即,可写入表1717保持不变并且被包括在转换后的租户容器1728中)。图18示出了用于从共享/租户系统1802转换到标准系统1804的系统1800。例如,如果跨容器访问导致不可接受的性能下降,或者例如如果确定不存在足够的共享内容来保证多重租赁,则这样的转换可能发生。共享/租户系统1802包括共享数据库容器1806和转换前租户数据库容器1808。标准系统1804包括转换后数据库容器1810。转换后数据库容器1810是转换前租户数据库容器1808的转换后图示。共享容器1806未在转换后的标准系统1804中使用。在流程图1812中描述了从共享/租户系统1802到标准系统1804的转换。在1814处,在转换后租户数据库容器1810中创建“tenant./w/tabr”表1815。(由于表1815在稍后的操作中被重命名,“/w/tabr”表名称被划掉)。在1816处,将数据从共享数据库容器1806中的只读表1818(例如,“shared./r/tabr”)复制到表1815。在1820处,从共享数据库容器1806中丢弃只读表1818(例如,“shared./r/tabr”)。在1822处,已经被配置用于只读表1818的视图1824被丢弃(例如,转换后数据库容器1810不包括视图)。在1826处,“tenant./w/tabr”表被重命名为“tenant.tabr”,如表1815的经更新的“tabr”名称所示。在操作1814、1820、1822和1826中描述的对只读数据的处理可以替换地由在替换流程图1828中描述的处理来执行。例如,在1830处,可以丢弃视图1824。在1832处,可以在数据库容器1820中创建具有名称“tabr”的表1815。在1834处,可以将数据从只读表1818复制到“tabr”表1815。继续流程图1812,在1836处,将数据从共享数据库容器1806中的只读表1838(例如,“shared./r/tab”)复制到转换前租户容器1808中的可写入表1840(例如“tenant./w/tab”)。也就是说,先前已被拆分为共享只读表1838和可写入表1840的记录现在被包括在可写入表1840中。在1842处,从转换前租户数据库容器1808中删除联合视图1844(例如,转换后数据库容器1810不包括联合视图)。在1846处,如转换后数据库容器1810中的表1848所示,可写入表1840(例如,“tenant./w/tab”)被重命名为“tenant.tab”。被包括在转换前租户数据库容器1808中的可写入表1850保持不变并且被包括在转换后数据库容器1810中,例如作为可写入表1852。图19示出了用于从模拟系统1902转换到标准系统1904的系统1900。例如,如果在模拟系统设置中检测到问题,则可以发生从模拟的系统共享类型到标准的系统共享类型的转换,开发人员希望在标准系统设置中调试该问题。模拟系统1902包括转换前模拟数据库容器1906。标准系统1904包括转换后租户数据库容器1908。转换后租户数据库容器1908是转换前模拟数据库容器1906的转换后的图示(例如,转换后租户数据库容器1908和转换前模拟数据库容器1906可以是相同的容器,每个容器具有不同的内容和不同的时间点)。在流程图1912中描述了从模拟系统1902到标准系统1904的转换。在1914处,丢弃对只读表1918的视图1916(例如,转换后租户数据库容器1908不包括视图)。在1920处,如由转换后租户数据库容器1908中的只读表1922所示,将只读表1918从名称“/r/tabr”重命名为“tabr”。在1924处,将内容从“/r/tab”只读表1926复制到“/w/tab”可写入表1928。也就是说,先前已被拆分成只读表1926和可写入表1928的记录现在被包括在可写入表1928中。在1930处,从转换前模拟数据库容器1906(例如,转换后租户数据库容器1908不包括联合视图)丢弃“tab”联合视图1932。在1934处,如由转换后租户数据库容器1908中包括的可写入表1936所示,将可写入表1928从“/w/tab”重命名为“tab”。在操作1924、1930和1934中描述的可写入数据的处理可以替换地通过在替换流程图1938中描述的处理来执行。例如,在1940处,可以将内容从可写入表1928复制到只读表。在1942处,“tab”视图1932可以被丢弃。在1944处,可以将只读表1926从“/r/tab”重命名为“tab”,成为可写入表1936。被包括在转换前模拟数据库容器1906中的可写入表1946保持不变,并且被包括在转换后租户数据库容器1908中,例如作为可写入表1948。通过交换共享数据库容器来部署在系统的使用期间(诸如维护和升级阶段期间),可能需要对系统部署改变。例如,改变可以包括紧急补丁、快速修护、服务包和版本升级。改变可以包括新内容、新表、经修改的内容或可能需要对共享数据库容器和/或租户数据库容器部署的的其他改变。部署(诸如补丁)可以是仅共享的补丁。例如,补丁可以包括对供应商提供的对象(诸如报告、类、模块或仅位于共享数据库容器中的其他对象)的改变。其他部署可以包括对共享数据库容器和租户数据库容器中的数据所做的改变。例如,给定的软件对象可以包括被存储在共享数据库容器和/或租户数据库容器中的数据。当对多重租赁数据库系统部署改变时可能会出现挑战,因为如果在线共享数据库容器被改变,则那些改变可以对租户应用可见。改变可能会导致不一致和/或应用错误。如果租户数据引用或依赖的共享内容改变,则所有连接的租户通常也应该进行改变,以确保租户的一致性。为了避免不一致和错误,租户可以升级,其可以涉及让租户离线。租户的升级可以包括至少部分存储在租户数据库中的对象的部署,以及与共享对象相关的租户对象的后处理。如果特定租户出现问题,则可以尝试在预定的停机时间窗口期间纠正该问题。如果在可用的停机时间窗口期间无法纠正问题,则可以将租户恢复为连接到更早版本的共享容器,然后使其恢复上线。然而,如果仅使用一个共享数据库容器,则需要连接到更早版本的共享容器的租户可能对已连接到新版本的共享容器的那些租户提出挑战。一种部署方法可以是,在部署各个租户中发生错误时,将所有租户恢复到先前版本,稍后为所有租户重新尝试部署。然而,这种方法可能会导致租户的不希望的停机时间。为了解决不希望的租户停机时间的问题,部署改变时可以采用不同类型的方法,以单独升级租户并暂时对尚未升级的租户隐藏改变。在第一方法中,如果部署包括(诸如利用紧急补丁)对系统中相对小比例的表的改变,则可以对现有生产共享数据库容器和现有生产租户数据库容器进行改变。在第二方法中,如果(诸如在特征发布期间)要对相对大数量的表进行改变,则可以使用交换共享容器的方法,以便新的共享数据库容器在其被插入系统时包括经改变的数据。新的共享数据库容器可以与现有的共享数据库容器并行插入到系统中。租户数据库容器可以单独被改变以连接到新的共享数据库容器。下面将更详细地描述这两种方法。如所提及的,利用交换的共享数据库容器方法,现有的共享数据库容器被替代为新版本,并且在连接的租户中调整内容。替代方法适当地避免了升级现有的共享容器,这可以减少整体部署运行时间。部署新的共享数据库容器,租户被链接到新的共享数据库容器,并可以删除旧的共享数据库容器。在部署期间,新的共享数据库容器与旧的共享数据库容器并行部署,以便这两个容器是可由租户同时访问的。使两个共享的数据库容器同时可访问允许在“正常运行”期间部署新的共享容器,因为租户仍然可以高效地使用旧的共享数据库容器。然后租户可以分别(单独或潜在的多个租户并行,但每个独立完成)升级。单独的租户升级可以允许每个租户定义单独的停机时间窗口。一个租户升级的问题不需要延长其他租户的停机时间。使两个共享的数据库容器同时可访问还允许一些租户临时保留在使用旧的共享数据库容器的旧版本的软件上,而一些租户则使用具有新的共享数据库容器的新版本的软件。在特定租户的更新期间,丢弃从旧的共享数据库容器读取的视图,并创建从新的共享数据库容器中读取的新视图。执行后续动作以对租户部署剩余内容。例如,如果对象被部分存储在共享数据库容器中,并且被部分存储在租户数据库容器中,则可以对租户部署与共享数据库容器一起被递送的对象的补充。另外,可以在租户中执行后续活动,如下面更详细描述的。图20示出了包括共享数据库容器2002和租户数据库容器2004中的对象的数据的系统2000。业务应用中使用的对象可以被保存在数据库表集合中。对象可以由供应商运送给客户,客户也可以创建自定义对象(例如类、配置、用户接口)。用于对象的保存的表可以是全部的相同表类型(例如,只读、混合、可写入)。因此,一些对象可以具有仅在共享数据库容器2002中或仅在租户数据库容器2004中的数据。作为另一示例,诸如如果若干对象重新使用表来存储(例如,文档或文本元素的)数据,则对象可以将数据存储在不同类型的表中。因此,一些对象可能具有共享数据库容器2002和租户数据库容器2004两者中的数据。因此,对象部署可以被拆分为两个部分:对共享数据库容器的部署和对(多个)租户数据库容器的部署。共享数据库容器2002包括存储命名为t2的混合表的只读记录的只读表t12006和只读表2008t2#1。租户数据库容器2004包括存储t2混合表的可写入租户记录的可写入表2010和可写入表2012。样式(style)键2014示出了用于标记共享数据库容器2002和租户数据库容器2004中的与包括供应商数据和客户数据的第一对象相对应的条目的虚线样式2016。例如,第一条目2018和第二条目2020分别表示为第一对象存储在共享数据库容器2002中的只读表2006和只读表2008中的共享供应商数据。第三条目2024表示为第一对象存储在租户数据库容器2004中的可写入表2010中的租户数据。在该示例中,第一对象不在可写入表2012中存储数据。样式键2014示出了用于标记租户数据库容器2004中的条目2028和2030的点划线样式2026。条目2028和2030分别表示为第二对象存储在可写入表2012和可写入表2010中的租户数据。第二对象是客户对象,其包括可写入客户数据并且没有共享只读数据。图21a示出了用于在数据库系统中部署对对象的改变的示例系统2100。部署工具2102可以从部署数据文件2104确定哪些对象具有要被部署的改变,哪些表将要利用对给定对象的改变而被更新,以及每个对象是否具有要对共享数据库容器2106、租户数据库容器2108或者共享数据库容器2106和租户数据库容器2108二者做出的改变。例如,部署工具2102可以从部署文件2104中的信息确定对象“r”2110包括tr1表2112和tr2表2114中的数据。部署工具2102可以从共享类型表2116(其可以存在于共享数据库容器2106或另一位置中)中的元数据确定tr1表2112和tr2表2114是只读表。因此,部署工具2102可以确定对象“r”是完全共享表(例如,仅存在于共享数据库容器2106中),如注释2118所示。作为另一示例,部署工具2102可以从部署文件2104中的信息确定对象“m”2120包括tr1表2112、t2表和t3表2122中的数据。部署工具2102可以从共享类型表2116中的元数据确定tr1表2112是只读表并且t3表2122是本地表。部署工具2102可以确定t2表是经拆分的表(并且因此实施为共享数据库容器2106中的只读表2123和租户数据库容器2108中的可写入表2124)。部署工具2102可以确定共享数据库容器2106与租户数据库容器2108之间的对象“m”的内容被拆分,如注释2125所示。作为又一示例,部署工具2102可以从部署文件2104中的信息确定对象“l”2126包括a1表2128、a2表2130、a3表2132和a4表2134中的数据,部署工具2102可以根据共享类型表2116中的元数据确定a1表2128、a2表2130、a3表2132和a4表2134每一个是本地表。因此,部署工具2102可以确定对象“r”是完全租户表(例如,仅存在于租户数据库容器2108中),如注释2136所示。在部署期间,部署工具2102可以跟踪部署状态,并且可以知道(不论部分地或完全地)部署了什么对象。例如,部署工具2102可以更新部署状态表2138,该部署状态表2138指示在当前时间点,对象“r”2110已经被完全部署、对象“m”2120已经部分部署、并且对象“l”尚未被部署。当使用交换的共享数据库方法时,仅在共享数据库容器2106中存在的对象在安装新的共享数据库容器时被更新。因此,如注释2140所示,部署工具2102不将内容部署到现有的共享数据库容器2106,而是共享数据库容器内容在新的共享数据库容器(图21a中未示出)中可用。部署状态表2138可以在准备新的共享数据库容器时被更新和填充,以指示例如完全共享对象“r”已经被部署(例如已经在新的共享数据库容器中)、对象“m”被部分部署(例如,对象“m”的共享部分在部署开始时已经在新共享数据库容器中,在tr1表2112和t2表2123中),并且对象“l”尚未被部署。对象“m”的剩余部分和对象“l”将被部署为租户部署的部分。对租户的部署可以包括部署存储在本地表中或混合表的本地部分中的、对象的部分。例如,将对象“m”部署到租户可以包括将数据部署到可写入表2124和/或到本地表2122。将对象“l”部署到租户可以包括部署到本地表a12128、a22130、a32132和a4。租户部署还可以包括将视图丢弃到共享数据库容器2106(例如,视图2142、2144、2146和2148)以及更新联合视图(诸如联合视图2150)。图21b示出了用于在数据库系统中部署对对象的改变的示例系统2180。系统2180是(例如,在紧急补丁的部署期间)当部署使用修改而不是交换现有的共享数据库容器的方法时系统2100的图示。如注释2184所示,部署工具2186(其可以与部署工具2102相同)可以将改变部署到完全或部分存储在共享数据库容器2106中的对象。例如,到共享数据库容器2106的部署可以包括在部署对象“r”时对只读表2114和只读表2122的适当的修改,以及在部署对象“m”时对只读表2114和只读表2112的适当的修改。部署状态表2138可以随着部署过程的进行而被更新。下面更详细地描述补丁的部署。图22示出了用于使用交换的共享数据库容器方法来升级多重租赁数据库系统2202的示例系统2200。多重租赁数据库系统2202包括第一租户数据库容器2204和第二租户数据库容器2206,第一租户数据库容器2204和第二租户数据库容器2206每一个被连接到共享数据库容器2208,第一租户数据库容器2204、第二租户数据库容器2206和共享数据库容器2208处于特定版本(例如版本“1708”)。同样在版本“1708”处的第一应用服务器2210向第一租户数据库容器2204发送对第一租户数据库容器2204和/或共享数据库容器2208中的数据的查询。类似地,同样在版本“1708”处的第二应用服务器2212向第二租户数据库容器2206发送对第二租户数据库容器2206中和/或共享数据库容器2208中的数据的查询。当将要部署新版本的应用和/或数据库时,与当前版本相比包括共享数据库容器改变的新的共享数据库容器可以被部署,如数据库系统2222中的在新版本(例如,版本“1711”)处的新的共享数据库容器2220所示。新的共享数据库容器2220与当前版本(例如,版本“1708”)共享数据库容器2224并行地被包括在数据库系统2222中。可以使用命名约定来命名新的共享数据库容器2220和当前版本共享数据库容器2224,以确保共享数据库容器名称的唯一性。例如,可以使用产品名称和版本号的组合来命名共享数据库容器。可以将租户一次一个地链接到新的共享数据库容器2222。例如,第二应用服务器2226和第二租户数据库容器2228已经升级到新版本(例如版本“1711”),其中第二租户数据库容器2228现在被链接到新的共享数据库容器2220。第一应用服务器2230和第一租户数据库容器2232仍旧处于旧版本(例如版本“1708”),并且第一租户数据库容器2232仍然连接到当前版本共享数据库容器2224。第一租户数据库容器2232可以被识别为要升级的下一个租户数据库容器。例如,数据库系统2240包括现在处于新版本(例如,版本“1711”)的第一租户数据库容器2242和第一应用服务器2244,其中第一租户数据库容器2242现在被连接到也处于新版本的新的共享数据库容器2244。旧数据库容器(例如当前版本数据库容器2224)已经被丢弃,并且不被包括在数据库系统2240中,因为所有租户现在都被连接到新的共享数据库容器2242。图23示出了用于将新服务包部署到多重租赁数据库系统的示例系统2300。系统2300包括处于版本“1231”和服务包2(servicepacktwo,sp2)的现有的共享数据库容器2302。用于第一租户的应用服务器2304和租户数据库容器2306也处于版本“1231”和sp2。现有的共享数据库容器2302、租户数据库容器2306以及各个所包括的组件以实线示出,以表示处于版本“1231”和sp2。视图2308提供对现有的共享数据库容器2302中的tabr只读表2310的访问。应用服务器2312所服务的第二租户已经升级到新的服务包级别(sp3),如下所述。部署工具2314可以将已经被配置为处于下一个服务包(sp3)的新的共享数据库容器2316附接到系统2300。新的共享数据库容器2316包括新的tabr只读表2318,该新的tabr只读表2318包括对新的服务包的改变。部署工具2314可以在升级第二租户时,从租户数据库容器2319中将视图丢弃到现有的共享数据库容器2302中的tabr只读表2310,并将新视图2320添加到新的共享数据库容器2316中的新的tabr只读表2318。部署工具2314可以将改变导入到可写入表2322中,使得可写入表2322处于新的服务包级别。租户数据库容器2319、新的共享数据库容器2316和各个所包括的组件以虚线示出以表示处于sp3。部署工具2314可以在稍后执行与为第二租户进行的部署操作类似的部署操作来升级第一租户,使得两者都处于sp3。在所有租户已经升级之后,现有的共享数据库容器2302可以被丢弃。图24示出了用于数据库系统2401的维护的示例系统2400。在准备部署时,可以使用服务包(sp)主机2402来创建递送包。例如,当将sp1服务包部署到数据库系统2401时,sp主机2402可能已被用于创建递送包2404。例如,sp1共享数据库容器2406和租户数据库容器2408、2410和2412每一个处于sp1级别。sp1共享数据库容器和租户数据库容器2408、2410和2412可以被称为集群。递送包2404可能已经被创建用于到集群的过去部署。递送包2404包括sp1共享数据库容器2406的副本2414和传输文件2416,该传输文件2416包括在部署sp1服务包期间已经被导入到租户数据库容器2408、2410和2412的改变。sp主机2402可以创建包括新的sp2共享数据库容器2420和包括对新的服务包(sp2)的改变的传输文件2422的新的递送包2418。新的sp2共享数据库容器2420可以被附接到数据库系统2401,如所附接的sp2共享数据库容器2424所示。租户数据库容器2408、2410和2412中的诸如视图的对象可以从sp1共享数据库容器2406分离并连接到所附接的sp2共享数据库容器2424。传输文件2422可以应用于租户数据库容器2408、2410和2412,以将它们升级到sp2级别。在所有租户已经升级之后,sp1共享数据库容器2406可以被丢弃。图25示出了用于将多重租赁系统2502升级到新版本的示例系统2500。多重租赁系统2502处于部分完成从旧“1708”版本升级到新“1711”版本的状态。如系统2500中所示,在相同给定时间,一些租户可以在生产中使用先前(例如“开始”)发布共享数据库容器,而其他租户使用新发布共享(例如“目标”)数据库容器,而其他租户则离线并升级到新发布。例如,多重租赁系统2502包括版本“1708”共享数据库容器2504。租户数据库容器2506和2508(例如,分别为“租户01”和“租户02”)也处于版本“1708”并被连接到版本“1708”共享数据库容器。租户数据库容器2510和2512(例如,分别为“租户05”和“租户06”)已经被转变为版本“1711”,并且现在被连接到在升级期间已经被添加到多重租赁系统2502的版本“1711”共享数据库容器2513。租户数据库容器2514和2516(例如,分别为“租户03”和“租户04”)当前正在升级。在流程图2520中概述给定租户的升级过程的概况。在2522处,给定租户在停机时间段的开始时被备份。例如,已经创建了租户数据库容器2514的备份2524和租户数据库容器2516的备份2526。在2528处,建立到新的(例如版本“1711”)共享数据库容器2513的链接。例如,可以建立新的视图,如以下在图26-图31中更详细描述的。在2530处,将增量部署到租户。增量可以被包括在传输文件中,并且可以包括要应用于给定租户数据库容器中的表的改变。在2532处,对部署是否成功做出确定。如果部署不成功,则执行处理操作2534。处理操作2534包括:在2536处恢复备份(例如,在版本“1708”处,诸如租户数据库容器2514的备份2524);在2538处建立到旧的(例如“版本1708”)共享数据库容器2504的链接;并在2540处向客户发布旧版本“1708”上的给定租户。在2538处建立链接可以包括将视图恢复到“版本1708”共享数据库容器2504中的表。可以稍后重新尝试部署。如果部署成功,则租户在2542处在新版本“1711”上发布给客户。图26至图31逐步地进一步详细示出用于使用交换的共享数据库容器方法将数据库系统升级到新版本的升级过程的各种阶段。交换的共享数据库容器方法也可用于服务包或补丁的部署。图26示出了使用交换的共享容器方法的新数据库版本的部署之前的示例系统2600。系统2600包括共享数据库容器2602,该共享数据库容器2602包括作为名称为“tab”的混合表的共享部分的只读表2604的当前版本。共享数据库容器2602还包括只读表2606。系统2600包括用于第一租户的第一租户数据库容器2608和用于第二租户的第二租户数据库容器2610。第一租户数据库容器2608包括到只读表2604(如箭头2614所示)的视图2612、作为混合表的本地部分的可写入表2616、提供对只读表2604和可写入表2616统一访问的联合视图2618、可写入表2620和到只读表2606(如箭头2622所示)的视图2621。类似地,第二租户数据库容器2610包括到只读表2604(如箭头2624所示)的视图2623、作为混合表的本地部分的可写入表2626、提供对只读表2604和可写入表2626统一访问的联合视图2628、可写入表2630、以及到只读表2606(如箭头2632所示)的视图2631。图27是通过交换共享数据库容器而部分升级的系统2700的图示。系统2700是在用于准备共享数据库容器的部署操作的第一集合期间的系统2600的视图。总之,新的共享数据库容器2704可以并行于现有的、在产共享容器(例如共享数据库容器2602)而部署,而不会中断现有的共享数据库容器2602的操作。在流程图2705中概述了用于准备共享数据库容器2704的部署操作的第一集合。在2706处,对部署是否被允许或者其他活动是否正在运行做出确定。如果部署不被允许和/或在部署期间不被允许的其他活动正在运行,则部署结束。如果允许部署,则在2707处,新的(例如版本2)共享数据库容器2704被复制并附接到数据库。新的共享数据库容器2704是被包括在递送包中的容器并且在供应商处创建,它包含新的软件版本(例如共享数据库容器2420的副本,与利用2807递送的租户部分放在一起)。新的共享数据库容器2704包括只读表2708,该只读表2708是被包括在服务包主机2402中的共享表的副本。在2712处,向租户提供目标连接信息(例如,url、用户名、密码)。例如,可以使得诸如新的共享数据库容器2704的地址的目标连接信息对第一租户数据库容器2608和第二租户数据库容器2610可用。可以向租户公布关于新的共享数据库容器2704的信息,这样租户可以阅读新的共享数据库容器内容。可以许可租户对共享容器中对象的只读访问。作为另一示例,目标连接信息可以被提供给将分别升级第一租户和第二租户的部署工具。如分别由指示器2714和2715所指示的,第一租户数据库容器2608和第二租户数据库容器2610可被指定为版本2(“v2”)目的地(例如,升级目标)。在2718处,从新的共享数据库容器2704提供信息(诸如,到部署工具),该信息包括共享表的列表、关于组件版本(例如,服务包级别)的信息、以及关于部署的传输和导入状态的信息。部署过程如下面针对图28所描述的而继续。图28是通过交换共享数据库容器而部分升级的系统2800的图示。系统2800是在用于对第一租户部署的部署操作的第二集合期间的系统2600的视图。在流程图2802中概述操作的第二集合。在2804处,获得连接性和新的共享空间信息。例如,将第一租户数据库容器2608连接到新的共享数据库容器2708的连接信息可以被提供给第一租户数据库容器2608和/或部署工具。例如,新的共享数据库容器2708的地址可以被提供给部署工具。在2806处,确定新的共享空间版本和匹配的服务包级别。例如,部署工具可以确保新的共享数据库容器2708的版本与增量部署包2807的版本匹配。增量部署包2807是例如在部署启动之前准备的文件。创建增量部署包2807可以包括识别被部分包括在新的共享数据库容器2704中的对象,并且计算剩余的部署部分(即,那些对象的本地内容部分以及对要作为部署的部分的那些本地内容部分的改变)。创建增量部署包2807还可以包括识别完全存储在租户容器中的对象,并识别对要作为部署的部分的那些对象的改变。在2808处,计算用于从共享表读取的视图的“丢弃/创建”或“更改”语句。例如,可以准备对只读表2606和只读表2604的视图的丢弃语句。例如,可以准备丢弃视图2631(如箭头2632所示)、视图2621(如箭头2622所示)、视图2612(如箭头2614所示)和视图2623(如箭头2624所示)的丢弃语句。可以准备用于在第一租户数据库容器2608中和在第二租户数据库容器2610中创建到只读表2708和只读表2710的新视图的各个创建视图语句。通常,新的共享数据库容器2704可以包括比共享数据库容器2602更多或更少的表。因此,要创建的视图集合取决于新的共享数据库容器2704的内容。新的共享数据库容器2704可以包括管理表(未示出),该管理表包括被包括在新的共享数据库容器2704中的表的列表。可以读取管理表,以便可以准备在被执行时会将视图丢弃到共享数据库容器2602中的所有表并为新的共享数据库容器2704中的所有表创建新视图的语句。在2810处,读取目标目的地和表名称,并且计算语句用于将数据传输到租户数据库容器。在2812处,计算对(多个)本地表的结构调整。例如,部署可以包括对第一租户数据库容器2608中的可写入表2616和/或可写入表2620的改变。作为另一示例,部署可以包括对第二租户数据库容器2610中的可写入表2626和/或可写入表2630的改变。如下所述,可以计算用于调整这些可写入/本地表的结构的(多个)语句(例如,(多个)更改语句),用于稍后执行。如果可写入表2616的结构将被调整,则可以准备用于重新创建联合视图2618的语句,以创建包括可写入表2616的更新结构的视图。部署过程如以下针对图29所描述的而继续。图29是通过交换共享数据库容器而部分升级的系统2900的图示。系统2900是在用于完成对第一租户的部署的部署操作的第三集合期间的系统2600的视图。在流程图2902中概述操作的第三集合。在2904处,执行预先准备的语句。例如,可以通过传输控制组件2905来执行先前准备的丢弃视图语句以将视图丢弃到共享数据库容器2602(例如,在先前附图中的箭头2614和2622分别所示的视图2612和2621)。可以在第一租户数据库容器2608中创建新的视图,使用先前准备的创建视图语句来创建到新的共享数据库容器2704中的只读表2708和只读表2710的新视图。例如,可以(利用如箭头2908所示的连接)创建只读表2708的视图2906。作为另一示例,可以(利用如箭头2912所示的连接)创建只读表2710的视图2910。传输控制组件2905还可以执行先前准备的更改语句来调整本地表的结构,如经更新的可写入表2914和经更新的可写入表2916所示。如果(例如,与只读视图2612相比)可写入表2914的结构是新的和/或视图2910的结构是新的,则传输控制组件2905可以执行语句以创建新联合视图2918来替代联合视图2618。在2920处,本地内容被部署。例如,传输程序2922可以将数据从增量部署包2807复制到经更新的可写入表2916。作为另一示例,传输程序2922可以将数据从增量部署包2807复制到经更新的可写入表2914。通常,本地内容可以包括作为被部分存储在新的共享数据库容器2704中并部分地存储在第一租户数据库容器2608中的对象的本地部分的内容。本地内容还可以包括被完全存储在第一租户数据库容器2608并且未被存储在新的共享数据库容器2704中的对象的内容。在2926处,将状态更新写入到本地补丁表。例如,可以(诸如在新的共享数据库容器2704(未示出)中的管理表中或另一位置中)存储指示第一租户已经升级到版本2的状态信息。在2928处,第一租户在目标共享空间处注册。例如,当被连接到新的共享数据库容器2704时,第一租户数据库容器2608可以在新的共享数据库容器2704中的管理表中被注册。在2930处,第一租户从源共享空间取消注册。例如,可以在共享数据库容器2602中的管理表中删除(或者标记为非活动)条目,其中删除或标记为非活动指示第一租户数据库容器2608不再连接到共享数据库容器2602。在2932处,版本1目的地信息被删除。部署过程如下面针对图5所描述的而继续。图30是通过交换共享数据库容器而部分升级的系统3000的图示。系统3000是在用于对第二租户部署的部署操作的第四集合期间的系统2600的视图。第二租户的部署可以包括与针对第一租户所执行的操作集合相同的操作集合,如以上针对图28和图29所描述的。第二租户的部署可以包括在第二租户数据库容器2610中向共享数据库容器2602丢弃视图(例如,先前附图中如箭头2624和2632分别示出的视图2623和2631)。对于第二租户的部署可以包括在新的共享数据库容器2704中创建到只读表2708和只读表2710的新视图,如新视图3002和箭头3004以及新视图3006和箭头3008所示。第二租户的部署可以包括对内容的调整以及将内容部署到本地表,如经更新的可写入表3010和经更新的可写入表3011所示。可以创建经更新的联合视图3012以反映经更新的写入表3010和/或新的视图3002的(多个)经更新的结构。一旦所有租户已经升级,共享数据库容器2602可以被丢弃,如“x”3014所示。图31是通过交换共享数据库容器而部分升级的系统3100的图示。系统3100是在已经完成对包括第一租户数据库容器2608和第二租户数据库容器2610的所有租户的部署之后,处于最终状态的系统2600的视图。共享数据库容器2602已经被丢弃并且不再被包括在系统3100中。例如,在已经执行了(多个)测试之后,可以丢弃共享数据库容器2602,以确保所有租户正在使用新的共享数据库容器2704。完成部署还可以包括执行其他测试,诸如以确保在新版本中要改变的所有对象的所有部分都已经被部署。其他终结任务可以包括触发每个租户数据库容器中的部署后活动(包括为对象执行后动作)用于经改变的共享内容。后动作可以包括针对已经被切换为从新的共享数据库容器2704读取的表,使应用程序服务器3102和/或应用程序服务器3104(应用程序服务器3102和3104是不同的或相同的服务器)中的(例如,存储先前读取的共享内容的)表缓冲器无效,使先前编译的对象无效,触发将对象重新编译为从新的共享数据库容器2704读取,重新生成依赖于共享内容和租户内容的租户专用对象,以及调用与租户中的经改变的内容的部署有关的其他应用专用的后续动作。部署后的动作可以确保对象与所部署的内容一致。跨共享和租户数据库容器修补内容图32示出了用于部署对对象的改变的系统3200。图32示出了用于部署对对象的改变的系统。如以上提及的,除了交换的共享数据库容器3202之外,对于一些部署,诸如用于具有对小于预定阈值数量的表的改变的补丁的部署,可以将改变适当地应用于共享数据库容器3202和租户数据库容器两者(例如,第一租户数据库容器3204和第二租户数据库容器3206)。部署可以分两个阶段执行:1)对共享数据库容器3202的部署;和2)对租户数据库容器3204和3206的部署,其可以独立执行。独立租户部署可以使能顺序和解耦部署。部署3208可以确保将补丁完全部署到共享数据库容器3202和每个租户数据库容器3204和3206,包括确保已经为所有租户执行了任何所计划的后续动作。部署工具3208可以针对给定对象识别部署包3210中的部署文件条目3209,并且确定给定对象包括被存储在t1、t2和t3表中的数据。部署工具3208可以访问指示t1表是共享只读表(并因此驻留在共享数据库容器3202中,例如作为只读表3214)、t2表是经拆分的表(并且因此部分驻留在共享数据库容器3202中,例如作为只读表3216),并且t3是租户本地表(并且因此分别驻留在租户数据库容器中,例如作为本地表3218和本地表3220)的元数据3212。部署工具3208可以基于元数据3212和部署文件条目3209来识别至少部分被包括在共享只读表3202中的给定对象。部署工具3208可以针对给定对象,部署对驻留在共享数据库容器3202中的给定对象的部分的改变,如由t1只读表3214中的条目3222和t2只读表3216中的条目3224所示。条目3222可以用来自部署文件条目3209中的条目3226的数据填充。类似地,条目3224可以用来自部署文件条目3209中的条目3228的数据填充。部署工具3208可以在状态表中存储指示给定的对象被部分部署的记录。部署工具3208接下来可以执行对租户阶段的部署,其可以包括到第一租户数据库容器3204的部署和对第二租户数据库容器3206的部署。对租户数据库容器的部署可以独立地操作,并且可以顺序或并行发生。部署工具3208可以基于条目3209和指示给定对象包括t3租户本地表中的数据的元数据3212,将与条目3209相关联的给定对象识别为已经被部分部署的对象。部署工具3208可以确定存储在部署文件条目3209中的条目3230中的给定对象的一部分尚未被部署。部署工具3208可以将条目3230部署到第一租户数据库容器3204和第二租户数据库容器3206,如条目3232和条目3234所示。可以由部署工具3208执行的其他部署任务包括识别尚未部署到共享数据库容器的对象(例如,仅驻留在本地租户表中的对象),以及部署对那些对象的改变。由部署工具3208执行的终结任务可以包括调用动作来操作所部署的内容,其可以包括例如触发缓冲器失效和缓冲器刷新,或者编译部署的代码。终结任务还可以包括确保部署中包括的所有对象的所有部分都已被部署。图33示出了用于使用共享数据库容器的隐藏准备来部署补丁的系统3300。如上所述,可能期望租户独立的部署,以便租户可以每一个定义自己的停机时间窗口,并且使得如果一个租户部署出现问题,但不是所有租户部署都需要恢复。部署与现有的共享数据库容器并行的新的共享数据库容器是一种方法。对于更小的改变,在现有的共享数据库容器中准备单独的表的隐藏版本可以是另一方法。这种隐藏部署方法可以通过提供租户单独回退选项来减少停机时间。对于租户来说,隐藏改变最初是不可见的,但这些租户仍然可以高效地使用共享数据库容器中的当前版本表,直到他们被单独部署并切换到使用新的表版本。系统3300包括提供部署的进展的概况的子系统3302、3304、3306和3308。下面的其他附图给出了每个部署阶段的更多细节。子系统3302包括共享数据库容器3310、第一租户的第一租户数据库容器3312、和第二租户的第二租户数据库容器3314。共享数据库容器3310包括具有名称“tabr#1”的处于第一版本的只读表3316。尽管在共享数据库容器3310中仅示出了一个表,但共享数据库容器3310可以包括其他表。第一租户数据库容器3312和第二租户数据库容器3314分别包括只读视图3318或只读视图3320,其中每个只读视图为相应租户提供对只读表3316的读访问。第一租户数据库容器3312和第二租户数据库容器3314还分别包括可写入表3322或可写入表3324。在第一部署阶段,修补系统3326创建只读表3316的克隆/副本,由新的只读表3328所示。新的只读表3328具有与只读表3316相同的结构。在第二部署阶段中,并且如子系统3304中所示,修补系统3326和/或部署工具可以通过导入对新的只读表3328的改变来修改新的只读表3328,用于将补丁部署到子系统3302。新的只读表3328以虚线显示以表示新的只读表3328处于包括补丁的新版本。在第三部署阶段中,并且如子系统3306中所示,第一租户被切换为兼容并连接到经更新的共享数据库容器3310。例如,视图3318被丢弃,并且创建到新的只读表3328的新视图3330。可写入表3322的结构可以被更新,如由经更新的可写入表3332所示。类似地,并且如子系统3308中所示,第二租户被切换为兼容并且连接到经更新的共享数据库容器3310。例如,视图3320被丢弃,并且创建到新的只读表3328的新视图3334。可写入表3324的结构可以被更新,如经更新的可写入表3336所示。在第四部署阶段,由于现在没有连接到只读表3316的租户,所以只读表3316被丢弃,如“x”3338所示。下面的图34-图39讨论了使用共享数据库容器的隐藏准备的部署(包括使用混合表)的更多所涉及的示例以及对每个操作的更详细的讨论。图34示出了在补丁的部署之前的示例系统3400。系统3400包括共享数据库容器3402,该共享数据库容器3402包括作为命名为“tab”的混合表的共享部分的只读表3403的当前版本(例如版本#1)。系统3400包括第一租户数据库容器3404和第二租户数据库容器3406。第一租户数据库容器3404包括到只读表3403的视图3408(如箭头3409所示)、作为混合表的本地部分、提供对只读表3403和可写入表3410的统一访问的联合视图3412、以及可写入表3414。类似地,第二租户数据库容器3406包括到只读表3403的视图3416(如箭头3417所示)、作为混合表的本地部分的可写入表3418、提供对只读表3403和可写入表3418的统一访问的联合视图3420、以及可写入表3422。图35示出了用于在将补丁部署到数据库系统期间的共享数据库容器的准备的系统3500。系统3500是在部署操作的第一集合已经完成之后的系统3400的视图。在流程图3502中概述部署操作的第一集合。在3504处,补丁系统3506读取部署包3508以识别内容将要被部署到其的共享表。例如,补丁系统3506可以基于部署包3508中的数据来识别针对其将补丁部署到共享数据库容器3402中的混合表的只读部分的命名为“tab”3509的混合表。如上所述,“tab”表的只读部分的当前版本被包括在共享数据库容器3402中作为只读表3403。在3510处,补丁系统3506克隆只读表3403以创建具有与只读表3403相同结构的只读表3512,并且将只读表3512的名称公布给在共享部署处运行的部署工具3516。只读表3512以目标名称“tab#2”命名,并用虚线示出,以表示只读表3512是只读表3403的新版本。管理表可以被更新以公布只读表3512的名称。所公布的名称可以在租户被部署并连接到只读表3512的稍后阶段使用。在3514处,部署工具3516将数据从部署包3508部署(例如,导入)到只读表3512,以将补丁部署到只读表3512。只读表3512针对租户应用是只读的,但是部署工具3516具有对只读表3512的写入访问。部署工具3516可以仅确定将要部署到共享数据库容器3402(例如,而不是租户数据库容器)的内容。在3518处,部署状态被存储(例如,在共享数据库容器3402(未示出)中的管理表中)。部署状态可以包括到tab表的补丁被部分地部署的指示(例如,在共享数据库容器3402中对tab混合表的只读可共享部分进行了改变,但tab混合表的可写入部分尚未更新)。管理表可以包括指示例如对可写入表3414(例如,命名为“tab2”)以及其他表的改变尚未被部署的信息。在3520处,具有目标名称“tab#2”的只读表3512的名称被公布到在租户部署处运行的补丁系统3506,或者以其他方式变得可用,作为只读表3403的新的版本的名称。所公布的名称在稍后的部署操作中使用,如下面更详细描述的。只读表3512保持隐藏,并且租户应用未使用,直到稍后的操作已经完成。图36示出了用于将补丁部署到租户数据库容器的系统3600。系统3600是在用于将补丁部署到第一租户数据库容器3404的部署操作的第二集合期间的系统3400的视图。在流程图3602中概述部署操作的第二集合。在执行操作的第二集合之前,可以为第一租户数据库容器3404启动停机时间段。在3604处,确定来自部署包3508的内容已经准备(例如,被部署为隐藏)在共享数据库容器3402中。在3606处,识别已经准备好并且部分部署的共享表,并且创建丢弃视图语句。例如,补丁系统3506可以识别只读表3512已经被准备为只读表3403的新版本。可以准备丢弃视图语句以丢弃到只读表3403的视图。在3608处,通过读取并在创建视图语句中包括只读表3512的公布目标名称来计算创建视图语句。在3610处,执行先前计算的丢弃视图语句和创建视图语句。丢弃视图语句丢弃第一租户数据库容器3404中的到只读表3403的视图。因此,现在没有源自第一租户数据库容器3404并在只读表3403处结束的箭头(例如,先前附图上的箭头3409)。创建视图语句创建到只读表3512的新视图3612(例如,由箭头3613所示)。在3614处,部署工具3516将内容部署到第一租户数据库容器3404。例如,部署工具3516可以将来自部署包3508的内容部署到被包括在第一租户数据库容器3404中的一个或多个可写入表,如由更新的可写入表3616所示。作为另一示例,来自部署包3508的内容可以被部署到包括与混合表相关联的租户本地内容的可写入表,该混合表与只读表3512相对应,如经更新的可写入表3618所示。部署工具3516可以确定尚未部署到共享数据库容器3402并且将被部署到租户的在部署包3508中的内容。在3620处,更新(多个)本地表结构和(多个)联合视图。例如,图34的联合视图3412可以被更新以连接到新视图3612和经更新的可写入表3618,如经更新的联合视图3622所示。作为另一示例,根据部署包3508中的数据,经更新的可写入表3616和/或经更新的可写入表3618的结构可以被更新。在第一租户的部署完成之后,第一租户的停机时间可以结束,其中第一租户数据库容器3404被成功地配置有对只读表3512的所部署的改变以及到只读表3512的经更新的连接。新视图3612、箭头3613、经更新的可写入表3616、经更新的可写入表3618及经更新的联合视图3622以虚线示出以表示第一租户数据库容器3404的补丁部署的完成。图37示出了用于将补丁部署到租户数据库容器的系统3700。系统3700是在用于将补丁部署到第二租户数据库容器3406的部署操作的第三集合期间的系统3400的视图。在执行操作的第三集合之前,可以为第二租户数据库容器3406启动停机时间段。将补丁部署到第二数据库容器3406可以包括与为第一数据库容器做出的相同或类似的操作,如流程图3602中概述的,除了对于第二数据库容器3406的操作以外。例如,可以丢弃第二数据库容器3406中的到只读表3403的视图(例如,图37中不再包括先前附图中示出的箭头3417)。可以创建到只读表3512的新视图3702,如箭头3704所示。内容可以被部署到可写入表,并且可写入表结构可以被更改,如由经更新的可写入表3706和经更新的可写入表3708所示。联合视图可被更新以提供对新视图3702和经更新的可写入表3708的统一访问,如由经更新的联合视图3710所示。在第二租户的部署完成之后,第二租户的停机时间可以结束,第二租户数据库容器3406被成功地配置有对只读表3512的所部署的改变以及到只读表3512的经更新的连接。新视图3702、箭头3704、经更新的可写入表3706、经更新的可写入表3708和经更新的联合视图3710以虚线示出以表示第二租户数据库容器3406的补丁部署的完成。图38示出了用于执行部署的终结的系统3800。系统3800是在用于执行终结/清除阶段的部署操作的第四集合期间的系统3400的视图。在流程图3802中概述操作的第四集合。在3804处,确定补丁是否已经被部署到所有注册租户。在3806处,响应于确定补丁已被部署到所有注册租户,丢弃不再使用的旧共享表。例如,补丁系统3506可以丢弃只读表3403,因为不再有连接到只读表3403的任何租户。在3808处,只读表3403的名称(例如,“tab#1”)从所公布的共享表的列表中移除。图39示出了使用共享数据库容器技术的隐藏准备的部署之后的系统3900。系统3900是在对包括第一租户数据库容器3404和第二租户数据库容器3406的所有租户的部署已经完成之后的系统3400的视图。共享数据库容器3402包括新版本只读表3512并且不再包括先前版本只读表3403。第一租户数据库容器3404和第二数据库容器3406包括经更新的组件,其包括到新版本只读表3512的连接。图40是用于处理不成功的租户部署的示例方法4000的流程图。将理解的是,方法4000和相关方法可以适当地例如通过任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个来执行方法4000和相关方法,并从客户端、服务器或其他计算设备的存储器获得任何数据。在一些实施方式中,方法4000和相关方法由上面针对图1描述的系统100的一个或多个组件执行。例如,方法4000和相关方法可以由图1的部署工具130执行。在4002处,检测到不成功的租户的部署。例如,可以接收到错误消息。在4004处,分析不成功的部署。例如,可以分析指示部署的哪些部分已经成功完成或遇到错误的状态信息。在4006处,确定是否可以立即或在预定时间窗内(例如,一小时)解决部署的问题。例如,预定时间窗可以是租户的停机时间窗的最大可接受长度。在4008处,响应于确定问题能够在预定时间窗内解决,问题被解决。例如,可以提供新的部署包,和/或可以重启系统或过程。在4010处,为租户重启部署。如果提供了新的部署包,则可以在部署重新尝试中使用新的部署包。在4012处,确定部署重新尝试是否成功。如果部署重新尝试未成功,则可以(例如,在4002处)重新执行方法4000。在4014处,响应于确定初始部署的问题不能在预定时间窗内解决,租户被恢复到部署之前的状态。在4016处,在部署开始之前,以租户的发布版本将租户提供给客户,使得在问题被解决的同时租户可以在线。在4018处,当租户在线时问题被解决。在4020处,为租户重启部署。可以确定部署成功,并且如果部署的重启没有成功,则方法4000可以被重新执行,如上所述。图41示出了用于将多个补丁部署到数据库系统的系统4100。租户独立的停机时间和部署可能会导致不同租户在给定时间点连接到不同版本,诸如如果为一个或多个租户重新尝试部署或者给定部署仍在进行中。由于计划的单独升级窗口或作为特定租户部署的问题以及撤销的结果,租户可能具有重叠的部署时间表。管理员可能希望将补丁部署到新版本上的那些租户,即使当其他一些租户尚未升级到新版本时。作为另一示例,可能希望将第二补丁和第一补丁部署到还没有部署第一补丁的租户。系统4100可以支持向租户部署多个补丁。例如,可以部分地完成将包“p1”部署到共享数据库容器和n个租户数据库容器的集群(例如,n个租户中的m(m<n)个租户没有部署p1补丁)。即使m个租户还没有p1补丁,但系统4100也可以支持补丁“p2”的部署。可能需要用新的补丁来对已经拥有p1补丁的一个或多个租户中出现的问题作出反应,而不需要等到所有租户都具有p1补丁。系统4100是示出了在将不同的补丁集合部署到不同的租户数据库容器之后对系统3400的改变的概述。共享数据库容器3402包括只读表3403和只读表3512(例如,只读表3402的第二版本)。与第一租户数据库容器3404相关联的第一租户已经升级到版本2。补丁系统3506已经创建了到版本2只读表3512的视图4102,并且部署工具3516已经将内容从补丁1部署包4104部署到第一租户数据库容器3404。在补丁1部署包4104已经被部署到第二租户数据库容器3406之前,可以在第二租户数据库容器3406中检测到问题。已经创建了包括对内容(包括tab和tab2表)的改变的补丁2部署包4106,以创建第三软件版本来解决所检测到的问题。补丁系统3506可以克隆版本2只读表3512以创建版本3只读表4108。部署工具3516可以将内容从补丁2部署包4106部署到版本3只读表4108以部署被包括在新补丁中的共享内容。补丁系统3506可以创建到版本3只读表4108的视图4110。部署工具3516可以部署来自补丁1部署文件4104和补丁2部署文件4106的租户内容以完成第二租户数据库容器3406到第三软件版本的升级。随后可以确定第三软件版本是否已经纠正了问题以及是否稍后将第一租户数据库容器3404升级到第三软件版本。下面针对图42至图48描述部署多个补丁的进一步细节。图42示出了用于在将多个补丁部署到数据库系统之前准备共享数据库容器的系统4200。系统4200是在已经完成部署操作的第一集合之后的系统3400的视图,用于准备将第一补丁部署到第一租户。在流程图4202中概述部署操作的第一集合,并且与以上针对流程图3502所描述的部署操作类似。在4204处,补丁系统3506读取部署包4206以识别要将内容部署到其的共享表。例如,补丁系统3506可以基于部署包4206中的数据来识别命名为“tab”的混合表4208,针对该混合表将第一补丁部署到共享数据库容器3402中的tab混合表的只读部分。尽管在该示例中使用了一个表(“tab”),但是通常,补丁系统3506可以确定将从部署包4206接收数据的共享容器中的表集合。下面为了讨论一般示例的目的,该表集合可以称为集合st_1。补丁系统3506可以确定集合st_1中的每个表的版本号,并且可以确定这些表的最大版本号。补丁系统3506可以确定目标版本号,v_target1=st_1中的最大版本号+1。在4210处,补丁系统3506克隆只读表3403以创建具有与只读表3403具有相同结构的版本2只读表4212,并且公布版本2只读表3512的名称。版本2只读表3512以目标名称“tab#2”命名。继续上面的一般示例,补丁系统3506可以针对集合st_1中的每个表在共享数据库容器3402中标识命名为<table-name>#<v_start>的源表,其中v_start是具有相同基本名称<table-name>的表的最高版本号(例如,共享数据库容器3402可以具有命名为doktl#3、doktl#5和doktl#11的表,因此对于表名称doktl,v_start是11)。补丁系统3506可以使用模式<table-name>#<v_target1>来创建每个所识别的源表的副本以制作相应目标表。在4214处,部署工具3516将数据从部署包4206部署(例如,导入)到版本2只读表4212,以将第一补丁部署到版本2只读表4212。部署工具3516可以仅确定将被部署到共享数据库容器3402(例如,而不是租户数据库容器)的内容。继续一般示例,部署工具3516可以将部署包4206的内容部署到共享数据库容器3402中的每个目标表<table-name>#<v_target1>。在4216处,部署状态被存储(例如,在共享数据库容器3402(未示出)中的管理表中)。部署状态可以包括到tab表的第一补丁被部分部署(例如,在共享数据库容器3402中已经对tab混合表的只读可共享部分做出的改变)的指示,但是第一补丁尚未被应用于tab混合表的可写入部分。在4218处,具有目标名称“tab#2”的版本2只读表4212的名称被公布或以其他方式变得可用,作为只读表3403的新版本的名称。也可以将版本号(例如,版本2)作为目标(例如,“跳转”)版本号公布,用于稍后的租户部署。对于一般示例,可以将编号v_target1传递给中央控制工具作为部署包4206的跳转版本,用于将来租户部署的编排。图43示出了用于将多个补丁部署到数据库系统的系统4300。系统4300是在将多个补丁部署到数据库系统期间已经完成用于部署第一补丁的部署操作的第二集合之后的系统3400的视图。在流程图4302中概述了部署操作的第二集合,并且与以上针对流程图3602所描述的操作类似。在4304处,确定已经在共享数据库容器3402中准备了来自部署包4206的针对第一补丁的内容(例如,被部署为隐藏)。补丁系统3506可以检索目标版本号v_target1用于在部署租户内容中使用。在4306,识别已经准备并部分部署的共享表,并且创建丢弃视图语句。例如,补丁系统3506可以识别版本2只读表4212已经被准备为只读表3403的新版本。可以准备丢弃视图语句以丢弃到只读表表3403的视图。继续一般示例,补丁系统3506可以在部署包4206中确定已经从部署包4206部署到共享数据库容器的内容的补充。例如,补丁系统3506可以识别将从部署包4206接收内容的所有表的集合st_1_all。补丁系统3506可以从集合st_1_all中移除已经部署在共享中的表(例如,集合st_1)。补丁系统3506可以确定剩余的集合st_1_rest。为了确定丢弃视图语句,补丁系统3506可以识别租户数据库容器3404中的当前视图,该当前视图从具有小于v_target1的版本的共享表选择。补丁系统3506可以为这些所识别的当前视图中的每一个准备丢弃语句。在4307处,通过读取并在创建视图语句中包括版本2只读表4212的公布目标名称来计算创建视图语句。对于一般示例,补丁系统3506可以通过确定表的最大版本号相同或小于v_target1来针对要被丢弃的当前视图中的每一个计算要在新视图中使用的表的版本。补丁系统3506可以使用要在新视图中使用的表的所确定的版本来准备创建视图语句。在4308处,执行先前计算的丢弃视图语句和创建视图语句。丢弃视图语句丢弃在第一租户数据库容器3404中的到只读表3403的视图。因此,现在没有源自第一租户数据库容器3404并在只读表3403结束的箭头(例如,先前附图上的箭头3409)。创建视图语句创建到版本2只读表4212的新视图4310(例如,由箭头4312所示)。在4214处,部署工具3516将内容部署到第一租户数据库容器3404。例如,部署工具3516可以将针对第一补丁的内容从部署包4206部署到被包括在第一租户数据库容器3404中的一个或多个可写入表,如由经更新的可写入表4316所示。作为另一示例,来自部署包4206的针对第一补丁的内容可以被部署到可写入表,该可写入表包括与对应于版本2只读表4212的混合表相关联的租户本地内容,如由经更新的可写入表4318所示。部署工具3516可以确定尚未部署到共享数据库容器3402并且将被部署到租户的部署包4206中的内容。在一般示例中,部署工具可以部署来自被包括在剩余表集合st_1_rest中的表的部署包的内容。在4220处,更新(多个)本地表结构和(多个)联合视图。例如,图34的联合视图3412可以被更新为连接到新视图4310和经更新的可写入表4318,如经更新的联合视图4322所示。作为另一示例,可以根据部署包4206中的数据来更新经更新的可写入表4316和/或经更新的可写入表4318的结构。图44示出了用于将多个补丁部署到数据库系统的系统4400。系统4400是在将多个补丁部署到数据库系统期间已经完成用于准备第二补丁的共享数据库容器的部署操作的第三集合之后的系统3400的视图。在流程图4402中概述了部署操作的第三集合,并且与以上针对流程图4202所描述的操作类似。在4404处,补丁系统3506读取第二补丁部署包4406以识别要将内容部署到其的共享表。对于一般示例,补丁系统3506可以确定将从部署包4406接收数据的共享容器中的表集合。该表集合可以被称为集合st_2。补丁系统3506可以确定集合st_2中的每个表的版本号,并且可以确定那些表的最大版本号。补丁系统3506可以确定目标版本号,v_target2=st_2中的最大版本号+1。在4408处,补丁系统3506克隆版本2只读表4212以创建版本3只读表4410,其具有与版本2只读表4212相同的结构,并且公布版本3只读表4410的名称。版本3只读表4410以目标名称“tab#3”命名。继续上面的一般示例,补丁系统3506可以针对集合st_2中的每个表在共享数据库容器3402中标识命名为<table-name>#<v_start>的源表,其中v_start是具有相同基本名称<table-name>的表的最高版本号。补丁系统3506可以使用模式<table-name>#<v_target2>来创建每个所标识的源表的副本以制作相应目标表。在4412处,部署工具3516将数据从第二补丁部署包4402部署(例如,导入)到版本3只读表4410,以将第二补丁部署到版本3只读表4410。继续一般示例,部署工具3516可以将部署包4406的内容部署到共享数据库容器3402中的目标表<table-name>#<v_target2>中的每一个。在4414处,部署状态被存储(例如,在共享数据库容器3402(未示出)中的管理表中)。部署状态可以包括到tab表的第二补丁被部分部署的指示。在4416处,具有目标名称“tab#3”的版本3只读表4410的名称被公布或以其他方式变得可用,作为只读表3403的新版本的名称。也可以将版本号(例如,版本3)作为目标(例如,“跳转”)版本号公布,用于稍后的租户部署。对于一般示例,可以将编号v_target2传递给中央控制工具作为部署包4406的跳转版本,用于将来第二补丁的租户部署的编排。图45示出了用于将多个补丁部署到数据库系统的系统4500。系统4500是在将多个补丁部署到数据库系统期间已经完成用于将第一和第二补丁部署到第二租户的部署操作的第四集合之后的系统3400的视图。操作的第四集合与上面在流程图4302中描述的操作类似,除了将第一补丁和第二补丁两者部署到第二租户数据库容器3406以外。例如,来自第二租户数据库容器3406的到只读表3403(例如,在先前附图中的箭头3417所示)的视图已经被丢弃。已经创建了到版本3只读表4410(如箭头4503所示)的新视图4502。内容已经被部署到经更新的可写入表4504并且可能到经更新的可写入表4506,经更新的可写入表4504和/或更新的可写入表4506的(多个)结构已经被更新,并且第二租户数据库容器3406现在包括经更新的联合视图4508。对于一般示例,补丁系统3506可以检索目标版本号v_target2用于将部署包4206和4406部署到第二租户数据库容器3406。补丁系统3506可以确定已经从部署包4206部署到共享数据库容器3402的内容的第一补充,以及从部署包4406部署到共享数据库容器3402的内容的第二补充,并且将第一补充和第二补充部署到第二租户数据库容器3406。图46图示了用于将多个补丁部署到数据库系统的系统4600。系统4600是在将多个补丁部署到数据库系统期间已经完成用于将第二补丁部署到第一租户的部署操作的第五集合之后的系统3400的视图。例如,可以基于确定第二补丁成功地解决针对第二租户识别的更早问题来确定将第二补丁部署到第一租户。操作的第五集合类似于上面在流程图4302中描述的操作,除了使用第二补丁部署包4406将第二补丁部署到第一租户数据库容器3404以外。例如,来自第一租户数据库容器3404的到第二版本只读表4212(例如,由先前附图中的箭头4312所示)的视图已经被丢弃。已经创建了到版本3只读表4410(如箭头4503所示)的新视图4602。内容已经被部署到经更新的可写入表4604并且可能被部署到经更新的可写入表4606,经更新的可写入表4604和/或经更新的可写入表4606的(多个)结构已经被更新,并且第一租户数据库容器3404现在包括经更新的联合视图4608。图47示出了用于将多个补丁部署到数据库系统的系统4700。系统4700是在将多个补丁部署到数据库系统期间已经完成用于终结部署的部署操作的第六集合之后的系统3400的视图。在流程图4702中概述部署操作的第六集合。在4704处,确定是否所有的传输已经被部署到所有注册租户。如果所有传输已被部署到所有注册租户,则在4704处,丢弃不再使用的旧共享表。例如,补丁系统3506可以丢弃只读表3403和版本2只读表4212,因为这些表不再连接到任何租户。在4706处,被丢弃的旧共享表名称从所公布的共享表的列表中移除(例如,只读表3403和版本2只读表4212)。图48示出了在已经完成将多个补丁部署到数据库系统之后的系统4800。系统4800是在已经完成将多个补丁部署到所有租户(包括第一租户数据库容器3404和第二租户数据库容器3406)之后的系统3400的视图。共享数据库容器3402不再包括只读表3403和版本2只读表4212,因为所有租户现在连接到版本3只读表4410。部署多种类型的改变当将新版本部署到多重租赁数据库系统时,可能会发生不同类型的改变。例如,可能有一个或多个以下类型的更改:1)表结构中的(多个)改变;2)哪些表共享和哪些表不共享的(多个)改变;或者3)对于混合表,关于哪些内容值被共享以及哪些内容值不被共享的(多个)改变。利用交换的共享数据库容器方法,新的共享数据库容器包括作为对新版本的改变的部分的这些改变中的任何一个。例如,新的共享数据库容器包括已经在目标结构中的表,包括经更新的键模式配置(如果需要),以及与混合表相关联的共享表包括遵循经更新的键模式配置的内容。部署工具可以确定要在每个租户中做出什么改变,以使每个租户与新的共享数据库容器兼容。部署工具可以使用结构改变机制、共享类型改变机制和数据拆分定义(键模式)改变机制的组合来重新配置租户,包括根据特定升级所需的改变的类型以规定的顺序使用这些机制,如下面更详细描述的。关于表结构定义中的改变,对于新的软件版本,表定义可能由于应用的需求而改变。部署过程可以调整表结构。如上所述,在多重租赁设置中,标准系统中的逻辑“单个表”(例如,从应用的角度来看)可以被表和视图(例如,对于共享只读表)或视图和两个表(例如,对于混合表)替代。对逻辑表的结构改变可能需要被贯彻到多重租赁系统中的多项目构造(例如,表和视图、两个表和视图)。当共享数据库容器与新版本交换时,共享数据库容器中的表已经具有新的表结构。可以通过调整表和视图的结构来更新租户作为租户部署的一部分。调整可能是必要的,因为如果表结构和/或视图结构不匹配,则选择语句可能会返回错误的结果或导致错误。关于共享类型的改变,可能希望新版本的软件改变表共享。共享比可能更少的表可能会增加总的拥有成本,因此可能希望确定附加的表以随时间共享。如下面更详细描述的,共享类型的改变可能需要将数据从共享数据库容器移动到(多个)租户数据库容器和/或从(多个)租户数据库容器移动到共享数据库容器。共享类型的改变也会导致从租户数据库容器中删除数据。如果应用期望表具有某种表共享类型,则具有不同的共享类型可能导致数据插入时的查询错误。例如,如果应用想要写入某个记录,但该表是共享类型只读的,则写入语句将不会成功。在升级过程中,可以执行共享类型只读、拆分和本地之间的潜在各种不同种类的转换。作为一个示例,应用可以被配置为支持多重租赁设置中的键用户的持久性可扩展性。客户可能希望在给定的时间点将自定义字段添加到表中。要改变的表当前可能是只读或拆分表类型。表的扩展(添加的字段)只能允许本地表类型。相应地在下一发布中,表可能需要从只读或拆分表类型改变为本地表类型。关于数据拆分定义中的改变,可能会发生两种类型的改变。首先,可能需要共享附加的内容。例如,应用(或管理员或开发人员)可以识别某些内容从未被客户修改。可以决定共享这些记录,以便降低总的拥有成本并加快改变部署。其次,可能会决定某些数据不能再共享。应用(或管理员或开发人员)可以确定某些当前共享的条目需要是可修改的。如果改变数据拆分定义,则可能需要调整(例如移动)存储的数据以匹配经更新的定义。数据拆分定义是与应用的契约的类型,用于让应用知道哪些记录值可以写入并存储在租户数据库容器中。如果数据拆分定义改变,则可以移动数据,使得数据拆分定义一致地描述存储在租户数据库容器中的数据(并且相应地,存储在共享数据库容器中的数据(例如使用数据拆分定义的补充))。调整存储的数据以匹配经更新的数据拆分定义可以避免唯一性约束违规、数据丢失和其他问题。图49是用于将不同类型的改变应用于多重租赁数据库系统的示例方法4900的流程图。将理解的是,方法4900和相关方法可以适当的例如通过任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个来执行方法4900和相关方法,并从客户端、服务器或其他计算设备的存储器获得任何数据。在一些实施方式中,方法4900和相关方法由上面关于图1描述的系统100的一个或多个组件执行。例如,方法4900和相关方法可以由图1的改变管理系统执行。在4902处,对于数据库系统中的表集合,对结构定义(s)、共享类型定义(t)和键模式(k)的改变被部署到新的共享数据库容器。新的共享数据库容器包括已经在目标结构中的表,并且包括现在要按照产品的目标版本所定义的而被共享的表(例如,如果表在共享类型中改变,新的共享数据库容器包括表的共享部分,或如果表现在完全共享,则包括整个表)。类似地,如果在拆分定义中更改表,则新的共享数据库容器中的共享表的新版本将包含与新的拆分定义一致的内容。在4904处,为了计算要为该表执行的动作集合的目的,识别表集合中的表,以完成部署的租户部分。在4906处,作出关于是否要对所识别的表进行仅对结构定义、共享类型定义或者键模式中的一个的改变的确定。在4908处,如果对所识别的表进行仅对结构定义、共享类型定义或者键模式中的一个的改变,则使用相应结构、共享类型或者键模式改变基础设施来执行一个改变。下面针对图50至图53来描述共享类型改变基础设施。下面针对图54来描述键模式改变基础设施。可以是数据字典的部分或者以其他方式与数据字典相关联的结构改变基础设施可以包括用于定义表和视图结构的机制。结构改变基础设施可以基于表结构和目标定义来计算表创建语句和表改变操作。结构改变基础设施可以从表定义中计算视图语句,例如选择表的所有字段的视图。结构改变基础设施可以针对数据库容器中的视图计算视图语句,该视图语句从另一数据库容器和另一模式中选择数据,其中视图读取其他数据库容器名称和模式定义作为输入参数。对于可写入表结构的改变,结构改变基础设施可以在租户数据库容器中适当调整可写入表的结构。对于只读表的结构的改变,结构变化基础设施可以在租户数据库容器中丢弃到旧共享数据库容器中的旧表的视图,并在租户数据库容器中创建到新的共享数据库容器中的新表的视图,新视图具有与新的只读表的结构匹配的新(与旧的、丢弃的视图相比)结构。对于拆分表结构的改变,结构改变基础设施可以:1)在租户数据库容器中丢弃对旧的共享数据库容器中的拆分表的旧只读表部分的视图;2)在租户数据库容器中丢弃拆分表的联合视图;3)调整租户数据库容器中的拆分表的可写入表部分;以及4)在租户数据库容器中创建新的联合视图,其中联合视图具有新的结构,该新结构是共享数据库容器中拆分表的新只读表部分和租户数据库容器中拆分表的经调整的可写入表部分的结构的联合。在4910处,做出关于是否要对所识别的表进行对结构定义和共享类型定义的改变的确定。在4912处,如果对所识别的表进行对结构定义和共享类型定义的改变,则使用共享类型改变基础设施来执行对共享类型定义的改变,所述共享类型改变基础设施包括由共享类型改变基础设施对结构定义的改变的集成。在4914处,确定是否要对所识别的表进行对结构定义和键模式的改变。在4916处,如果对所识别的表进行对结构定义和键模式的改变,则首先使用结构改变基础设施来改变结构定义。在4918处,如果要对所识别的表进行对结构定义和键模式的改变,则在由结构改变基础设施已经改变结构定义之后,使用键模式改变基础设施来改变键模式。在4920处,确定是否有更多的表要处理。如果有更多的表要处理,则(例如,在4904处并处理)识别下一个表。对共享类型和键模式的改变的组合通常不会同时发生在给定的表上,因为键模式改变将指示共享类型的表在表被修改之前和之后被拆分。图50是用于改变一个或多个表的共享类型的示例方法5000的流程图。应该理解,方法5000和相关方法可以适当地例如通过任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个来执行方法5000和相关方法,并从客户端、服务器或其他计算设备的存储器获得任何数据。在一些实施方式中,方法5000和相关方法由上面针对图1描述的系统100的一个或多个组件执行。例如,方法5000和相关方法可以由图1的共享类型改变基础设施140执行。在5002处,接收具有新的共享表集合的新的共享数据库容器,该新的共享表集合与旧的共享容器中的旧的表集合相比,在针对至少一些新的共享表集合的共享类型上具有差异。在5004处,接收到针对新的表集合的共享类型的目标定义。目标定义可以包括对一个或多个表共享类型的改变。例如,如果确定租户对共享数据的远程访问具有不可接受的性能(例如,可以在复杂的视图中使用共享表),则可能想要改变共享类型。希望的改变是使当前共享的表成为本地表以提高性能。作为另一示例,如上所述,可以做出决定来共享比当前正被共享的表更多的表,或者允许对表进行更多的扩展,这可能导致更多的表被定义为本地表。共享类型的改变可能需要将更多的表、更少的表或新表存储在共享数据库容器中。在5006处,将当前共享类型与租户容器中的每个表的目标共享类型进行比较。考虑到共享只读、拆分和本地三种共享类型,可以识别出六种不同类型的共享类型改变,包括:1)从共享只读到本地(r→l);2)从共享只读到拆分(r→w);3)从本地到共享只读(l→r);4)从本地到拆分(l→w);5)从拆分到共享只读(wr);和6)从拆分到本地(w→l)。在5008处,在租户容器中为每个表改变表内容和访问逻辑以反映相应表的新共享类型。修改表内容和访问逻辑可以包括:删除租户中的内容并链接到共享数据库容器中的内容;将内容从共享数据库容器复制到租户数据库容器并将(多个)链接移除到共享数据库容器;通过将租户数据复制到新表中并创建对租户和共享数据的联合视图来拆分数据;并通过将共享数据复制到租户数据库容器并移除联合视图来合并数据。此外,关于从一个共享类型改变到另一共享类型的更具体的细节将在下面参考图51至图53进行描述。图51是示出从第一表类型到第二、不同表类型的转换的表5100。例如,可以将类型为本地5102(“l”)的表转换为类型为共享只读5104(“r”)或拆分5106(“w”,其中拆分是对于混合表的另一项)。类型共享只读5108的表可以被转换为类型本地5110或类型拆分5106的表。类型拆分5112的表可以被转换为类型共享只读5104或类型本地5110的表。如单元5114所示,从表类型共享只读5108到表类型拆分5106(例如,r→w)的转变可包括处理操作:丢弃到共享表5114a的视图,创建“/w/tab”租户本地表5114b,并创建联合视图5114c。例如,图52示出了包括处于第一版本的第一系统5202和处于第二、稍后版本的第二系统5204的系统5200。被包括在第一系统5202中的租户容器5206包括对被包括在共享容器5212中的共享表5210的只读视图5208,其中只读视图5208和共享表5210是共享只读表类型5108的实施方式。共享只读表5210的“t1:r”标签中的“:r”指示符指示共享只读表5210是共享只读实施方式的部分。如单元5114所示,执行转变以将共享只读表类型5108的实施方式改变为第二系统5204中的拆分表类型5106的实施方式。在从第一系统5202到第二系统5204的转变中,丢弃只读视图5208(例如,处理操作5114a)。例如,只读视图5208不被包括在第二系统5204中的租户容器5214中。在租户容器5214中创建可写入表5216(例如,“/w/t1”)(例如,处理操作5114b)。在租户容器5214中为可写入表5216和共享容器5221中的共享表5220(例如,处理操作5114c,共享表5220对应于共享表5210)创建联合视图5218。可写入表5216、联合视图5218和共享表5220是第二系统5204中的拆分表类型5106的实施方式。用于共享表5220的“t1:w”标签中和在可写入表5216的“/w/t1:w”标签中的“:w”指示符分别指示共享表5220和可写入表5216是拆分表实施方式的部分。如果对表进行表结构改变以及共享类型改变,则在共享类型改变完成后,可以在本地表上进行表结构改变。图53说明了各种表类型之间的转变。表类型之间的转变包括从共享只读类型5108(“r”)到拆分表类型5106(“w”)的转变。例如,先前版本系统5302包括共享只读类型的实施方式,如租户容器5306中的只读视图5304和共享容器5310中的共享表5308。当前版本系统5312示出在从共享只读类型5108(“r”)转变到拆分表类型5106(“w”)之后的先前版本系统5302的内容。已经丢弃了只读视图5304,在租户容器5316(租户容器5316是租户容器5306的转变后图示)中已经创建了可写入表5314,并且已经在租户容器5316创建了联合视图5317以提供对共享容器5319中的可写入表5314和共享表5318的访问(共享表5318对应于共享表5308,而共享容器5319是共享容器5310的转变后图示)。再次参考图51,如单元5116所指示,从共享只读表类型5108到本地表类型5110(例如,r→l)的转变可以包括处理操作:丢弃视图5116a,创建表5116b,以及从共享表5116c复制数据。例如,如图52所示,租户容器5206包括对被包括在共享容器5212中的共享表5224的只读视图5222,其中只读视图5222和共享表5224是第一系统5202中的共享只读表类型5108的实施方式。如果要对该表执行表结构改变以及共享类型改变,则可以在共享类型改变完成之后在本地表上执行表结构改变。如单元5116所表示的,共享只读表类型5108的实施被改变为第二系统5204中的本地表类型5110的实施方式。在从第一系统5202到第二系统5204的转变中,只读视图5222被丢弃(例如,处理操作5116a)。例如,只读视图5222不被包括在第二系统5204中的租户容器5214中。在租户容器5214中创建本地表5226(例如,“t2”)(例如,处理操作5116b)。数据从共享表5224复制到所创建的本地表5226。本地表5226是第二系统5204中的本地表类型5110的实施方式,如本地表5226的“t2:l”标签中的“:l”所指示的。在一些实施方式中,在数据被复制到本地表5226之后,共享表5224被丢弃。图53包括从共享只读表类型5108(“r”)到本地表类型5110(“l”)的转变的另一图示。例如,先前版本系统5320包括共享只读类型的实施方式,如租户容器5324中的只读视图5322和共享容器5328中的共享表5326。当前版本系统5330示出在从共享只读类型5108(“r”)转变到本地表类型5110(“l”)之后的先前版本系统5320的内容。已经丢弃了只读视图5322,在租户容器5332(租户容器5332是租户容器5324的转变后图示)中已经创建了本地表5331,已经从共享表5326将数据复制到本地表5331(例如,如箭头5333所示),并且共享表5326在完成数据复制操作之后已经被丢弃(例如,在作为共享容器5328转换后的图示的共享容器5334中没有共享表)。再次参考图51,如单元5118所示,从拆分表类型5112到共享只读5104表类型(例如,w→r)的转变可以包括丢弃本地表5118a,丢弃联合视图5118b,并创建到共享表5118c的视图的处理操作。例如,如图52所示,租户容器5206包括联合视图5228和本地表5230,并且共享容器5212包括共享表5232,联合视图5228、本地表5230,且共享表5232是第一系统5202中的拆分表类型5108的实施方式。如单元5118所表示的,拆分表类型5112的实施方式被改变为第二系统5204中的共享只读型表类型5104的实施方式。在从第一系统5202到第二系统5204的转变中,丢弃本地表5230(例如,处理操作5118a)并且丢弃联合视图5228(例如,处理操作5118b)。例如,本地表5230和联合视图5228不被包括在第二系统5204中的租户容器5214中。在一些实施方式中,如果本地表5230包括内容,则来自本地表5230的数据可以被存储在隔离表用于部署之后的分析以及潜在数据检索。在租户容器5214中,创建到被包括在共享容器5221中的共享表5236的只读视图5234,共享表5236对应于共享表5232。只读视图5234和共享表5236是第二系统5204中的共享只读表类型5104的实施方式。图53包括从拆分表类型5112(“w”)到共享只读表类型5104(“r”)的转变的另一图示。例如,先前版本系统5336包括拆分类型的实施方式,如提供对租户容器5338中的本地表5339和共享容器5341中的共享表5340的访问的在租户容器5338中的联合视图5337。当前版本系统5342示出在从拆分表类型5112(“w”)转变到共享只读表类型5104(“r”)之后的先前版本系统5336的内容。已经丢弃了本地表5339和联合视图5337(例如,本地表5339和联合视图5337未出现在租户容器5343(租户容器5343是租户容器5338的转变后图示)中。已经在租户容器5343中创建了只读视图5344,以提供对共享容器5346中的共享表5345(共享表5345对应于共享表5340)的访问。再次参考图51,如单元5120所示,从拆分表类型5112到本地表类型5210(例如w→l)的转变可以包括将数据从共享表复制到本地表5120a并建立一个表(例如,作为本地表)5120b的处理操作。例如,如图52所示,租户容器5206包括联合视图5238和可写入表5240,并且共享容器5212包括共享表5242,联合视图5238、可写入表5240和共享表5242是第一系统5202中的拆分表5108的实施方式。如果要对该表执行表结构改变以及共享类型改变,则可以在共享类型改变完成后在本地表上进行表结构改变。如单元5120所示,可以将拆分表类型5112的实施方式改变为第二系统5204中的本地表类型5110的实施方式。在从第一系统5202到第二系统5204的转变中,数据从共享表5242复制到可写入表5240(例如,处理操作5220a)。在处理操作5220b处,在租户容器5214中建立一个表作为本地表(例如,处理操作5220b)。例如,可以丢弃共享表5242和联合视图5238。例如,共享表5242和联合视图5238不被包括在第二系统5204中的租户容器5214中。可以在租户容器5214中将可写入表5240重命名,例如从替换名称(例如“/w/t4“)重命名为“标准”名称(例如,“t4”),如针对可写入表5244所示出的。可写入表5244是第二系统5204中的本地表类型5110的实施方式。图53包括从拆分表类型5112(“w”)到本地表类型5110(“l”)的转变的另一图示。例如,先前版本系统5350包括拆分类型的实施方式,如提供对租户容器5351中的本地表5353和共享容器5355中的共享表5354的访问的在租户容器5352中的联合视图5351。当前版本系统5356示出了在从拆分表类型5112(“w”)到本地表类型5110(“l”)的转变之后的先前版本系统5350的内容。如由租户容器5358(租户容器5358是租户容器5352的转变后图示)中的本地表5357所示,可写入表5353已经从“/w/t4”重命名为“t4”。数据已经从共享表5354复制到本地表5357,如箭头5359所示。在数据已被复制之后,共享表5354已被丢弃。联合视图5351也已被丢弃。例如,共享表5354不出现在当前版本系统5356中的共享容器5360中,联合视图5351不出现在租户容器5358中。再次参考图51,如单元5122所指示,从本地表类型5102到共享只读表类型5104(例如,l→r)的转变可以包括处理操作:丢弃本地表5122a并创建到共享表5122b的视图。例如,如图52所示,租户容器5206包括本地表5246,其是第一系统5202中的本地表类型5110的实施方式。如单元5122中所述,丢弃本地表5246(例如,处理操作5122a)。例如,本地表5246不被包括在第二系统5204中的租户容器5214中。在一些实施方式中,如果本地表5426包括内容,则来自本地表5426的数据可以被存储在隔离表中用于部署之后的分析和潜在数据检索。创建只读视图5248以访问共享容器5221中的共享表5250。共享表5250可以已经存在于共享容器5221中(例如,以服务其他租户),或者可以在共享容器5221中创建共享表5250。只读视图5248和共享表5250是第二系统5204中的共享只读表类型5104的实施方式。图53包括从本地表类型5110(“l”)到共享只读表类型5104(“r”)的转变的另一图示。例如,先前版本系统5362包括本地类型的实施方式,如租户容器5365中的本地表5364。当前版本系统5366示出在从本地表5110(“l”)转变到共享只读表类型5104(“r”)之后的先前版本系统5362的内容。本地表5364已经被丢弃(例如,本地表5364未出现在当前版本系统5366中的租户容器5367中(租户容器5367是租户容器5365的转变后图示)。在租户容器5367中创建了只读视图5368,以提供对被包括在当前版本系统5366中的共享容器5370中的共享表5369的访问。共享表5369可能已经存在于共享容器5370中(例如,以服务其他租户)或者已经在共享容器5370中被创建,作为转变的部分。再次参考图51,如单元5124所示,从本地表类型5102到拆分表类型5106(例如,l→w)的转变可以包括处理操作:根据键模式将当前数据复制到可写入表5124a,丢弃旧表5124b,并创建联合视图5124c。例如,如图52所示,租户容器5206包括本地表5252,其是第一系统5202中的本地表类型5110的实施方式。如单元5124中所述,将数据从本地表5252复制到租户容器5214中的可写入表5254(例如,处理操作5124a)。例如,表5252可以被临时重命名(例如,“/old/t6”),可以创建可写入表5254(例如,具有名称“/w/t6”),并且可以根据所定义的键模式将数据从本地表5252复制到可写入表5254。在数据被复制之后,本地表5252可以被丢弃(例如,处理操作5124b)。可以为共享容器5221中的可写入表5254和共享表5258创建联合视图5256(例如,处理操作5124c)。共享表5258可能已经存在于共享容器5221中(例如,以服务其他租户),或者可以在共享容器5221中被创建。联合视图5256、共享表5258和可写入表5254是在第二系统5204中的拆分表类型5106的实施方式。如果要为表执行表结构改变以及共享类型改变,则可以在创建联合视图5256之前对可写入表5254执行表结构改变。图53包括从本地表类型5110(“l”)到拆分表类型5106(“w”)的转变的另一图示。例如,先前版本系统5372包括本地类型的实施方式,如租户容器5376中的本地表5374。当前版本系统5378示出在从本地表5110(“l”)转变到拆分表类型5106(“w”)之后的先前版本系统5372的内容。如由租户容器5382(租户容器5382是租户容器5376的转变后图示)中的可写入表5380所示,本地表5374可以被重命名(例如从“t6”到“/w/t6”),而不是如针对本地表5252和可写入表5254所描述的那样将数据从本地表5374复制到新的可写入表中。已经在当前版本系统5378中的共享容器5385中创建共享表5384。在租户容器5382中已经创建联合视图5386,以提供对可写入表5380和共享表5384的访问。图54示出了用于在交换共享数据库容器时改变租户键(例如,拆分定义)的系统5400。租户键的更改可以通过拆分定义改变基础设施来执行。拆分定义改变基础设施包括以活动状态和非活动状态存储每个表的拆分定义的机制。拆分定义改变基础设施可以计算和执行dml(datamanipulationlanguage,数据操纵语言)语句来复制数据和删除数据,以便表符合拆分定义。如上所述,可以在租户数据库容器中使用where子句来定义拆分定义(也被称为键模式),该where子句定义了可以存储在混合表的本地表部分中的记录。系统5400包括版本1共享数据库容器5402,该版本1共享数据库容器5402包括租户键表5404和作为命名为“tab”的混合表的只读部分的只读表5406。只读表5406包括具有以“a”开头的键的记录5408和具有以“y”开头的键的记录5410。记录5408和5410的键符合被包括在租户键表5404中的where子句5411。where子句5411定义允许为租户写入的键,并且where子句5411的补充定义被允许存储在只读表5406中的键。记录5408和5410的键值“a*”和“y*”分别与“not(keylike‘b%’orkeylike‘z%’)”的where子句5411的补充匹配。换句话说,记录5408和5410的键不以“b”或“z”开头。针对第一租户的版本1租户数据库容器5412包括到租户键表5404的视图5413,到只读表5406的视图5414,作为“tab”混合表的可写入部分的可写入表5416,和到可写入表5416和只读表5406的联合视图5418(通过视图5414)。可写入表5416包括具有以“b”(例如,匹配where子句5411)开头的键的记录5420和具有以“z”开头的键(例如,还匹配where子句5411)的记录5422。在部署期间,(多个)开发者和/或管理员可以确定where子句5411现在是不正确的。例如,可以确定不再共享具有以“y”开头的键的记录(例如,可能希望租户能够用以“y”开头的键来存储本地记录)。作为另一示例,可以确定现在应当共享以“b”开头的记录(例如,可以确定租户应用不写入以“b”开头的本地记录)。已经准备了用于部署系统5400的版本2的共享数据库容器5424。版本2共享数据库容器5424包括经更新的租户键表5426,其包括指示允许租户向命名为“tab”的混合表中写入具有以“y”或“z”开头的键的记录的经更新的where子句5428。经更新的只读表5430包括将对命名为“tab”的混合表共享的记录。例如,经更新的只读表5430包括具有以“a”开头的键的记录5432(其可以是记录5408的副本)和具有以“b”开头的键的记录5434(其可以是先前提供给租户,但租户可以编辑,但现在是只读和共享的记录)。记录5432和5434具有与经更新的where子句5428的补充匹配的键。记录5434可以与记录5420相同或不同。例如,第一租户可能已经在记录5420被首先提供给第一租户之后修改了记录5420。可以使用升级过程来将租户数据库容器升级到系统5400的版本2。例如,版本2租户数据库容器5440已经升级到版本2,并且现在连接到版本2共享数据库容器5424。版本2租户数据库容器5440包括到经更新的租户键表5426的视图5442、经更新的可写入表5444、到经更新的只读表5430的经更新的视图5446、以及经更新的联合视图5448。经更新的可写入表5444包括具有以“y”开头的键(例如,与经更新的where子句5428兼容)的记录5450和具有以“z”开头的键(例如,也与经更新的where子句5428兼容)的记录5452。以下为了讨论的目的,假设版本2租户数据库容器5440的内容与在版本2租户数据库容器5440被升级到版本2之前的版本1租户数据库容器5412相同,并且相应地,为了讨论的目的,版本1租户数据库容器5412可以是版本2租户数据库容器5440的预部署视图。部署工具可以确定在将版本1租户数据库容器5412升级到版本2期间在版本1租户数据库容器5412中要改变什么。部署工具可以识别只读表5406中的将从只读表5406被移动到可写入表5416的记录(例如,用于被共享和不再被共享的记录)。部署工具可以执行以下插入语句,以将记录从只读表5406移动到可写入表5416(假设共享数据库容器5402的名称是“shared_old”,并且“<new_where_condition>”是经更新的where子句5428):insertinto/w/tab(select*fromshared_old.tabwhere(<new_where_condition>))。因为记录5410的键“y*”匹配经更新的where子句5411,所以插入语句可以使得记录5410被移动到可写入表5416(例如,如由记录5450在经更新的可写入表5444中所示)。部署工具可以识别要在可写入表5416中删除的记录(例如,不再允许本地存储为由第一租户可编辑的记录的记录)。例如,部署工具可以执行以下语句以从可写入表5416中删除记录:deletefrom/w/tabwherenot(<new_where_condition>)。由于记录5420的键“b*”不匹配经更新的where子句5428,所以删除语句可以使得从可写入表5416中删除记录5420。例如,类似的记录可能已经在经更新的可写入表5444的升级期间从经更新的可写入表5444删除(例如,经更新的可写入表5444不包括以“b”开头的任何记录)。记录5420在被删除时可以被移动到隔离位置。示例方法图55是用于重新定向写入查询的示例方法5500的流程图。将理解的是,方法5500和相关方法可以适当地例如通过任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个来执行方法5500和相关方法,并从客户端、服务器或其他计算设备的存储器获得任何数据。在一些实施方式中,方法5500和相关方法由上面针对图1描述的系统100的一个或多个组件执行。例如,方法5500和相关方法可以由图1的写入重新定向器128执行。在5502处,向至少一个应用提供对数据库系统的访问。至少一个应用可以包括一个或多个租户应用。例如,访问可以由数据库接口提供。在5504,从至少一个应用接收第一查询。第一查询可以是在数据库系统中检索、添加或编辑数据。在5506处,在数据库系统中确定第一查询与联合视图相关联,联合视图提供对被包括在共享数据库容器中的只读表和被包括在租户数据库容器中的可写入表的统一只读访问。在5508处,确定第一查询是否是读取查询。读取查询会检索数据,但不会修改数据或向数据库系统添加数据。在5510处,响应于确定第一查询是读取查询,使用联合视图来处理第一查询。使用联合视图处理第一查询可以包括从只读表和可写入表中的一个或两个中检索数据。在5512处,响应于确定第一查询不是读取查询(例如,第一查询是写入查询),将第一查询修改为使用可写入表而不是联合视图。写入查询因此被重新定向到使用可写入表而不是只读联合视图。在5514,使用可写入表来处理第一查询。使用可写入表处理第一查询可以包括修改数据或向可写入表添加数据。图56是用于键模式管理的示例方法5600的流程图。将理解的是,方法5600和相关方法可以例如通过适当的任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个来执行方法5600和相关方法,并从客户端、服务器或其他计算设备的存储器获得任何数据。在一些实施方式中,方法5600和相关方法由上面针对图1所描述的系统100的一个或多个组件执行。例如,方法5600和相关方法可以由图1的约束执行系统126执行。在5602处,向至少一个应用提供到数据库系统的访问。在5604处,从至少一个应用接收针对逻辑数据库表的至少一个查询。逻辑数据库表在数据库系统中表示为包括被允许至少一个应用写入的逻辑数据库表的记录的第一物理数据库表和包括被允许由至少一个应用写入但不读取的逻辑数据库表的记录的第二物理数据库表。在5606处,确定至少一个查询是写入查询。写入查询被配置为修改数据或添加数据到数据库系统。在5608处,确定至少一个查询是否符合键模式配置。键模式配置描述了被包括在或可能被包括在(例如,被添加到)第一物理数据库表中的记录的键。在5610处,响应于确定至少一个查询符合键模式定义,写入查询被重新定向到第一物理数据库表。重新定向可以包括修改写入查询以使用第一个物理数据库表而不是逻辑数据库表。在5612处,响应于确定至少一个查询不符合所述键模式配置,写入查询被拒绝。拒绝写入查询可以防止将记录添加到不符合键模式配置的第一物理数据库表中。图57是用于在系统共享类型之间转换的示例方法5700的流程图。将理解的是,方法5700和相关方法可以例如通过适当的任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个执行方法5700和相关方法,并从客户端、服务器或其他计算设备的存储器获得任何数据。在一些实施方式中,方法5700和相关方法由上面针对图1描述的系统100的一个或多个组件执行。例如,方法5700和相关方法可以由图1的系统共享类型修改器148执行。在5702,接收到将数据库系统从标准系统设置转变为共享系统设置的请求。数据库系统包括租户数据库容器。租户数据库容器在将数据库系统从标准系统设置转变为共享系统设置之前包括:用于存储只读数据的只读表,该只读数据被(多个)应用读取但不被写入;第一可写入表,用于存储由(多个)应用读取和写入的可写入数据;以及混合表,用于存储由(多个)应用读取但不写入的只读混合数据和由(多个)应用读取和写入的可写入混合数据。尽管描述了单个只读表、单个可写入表和单个混合表,但是租户数据库容器可以包括各种类型的表的任何组合。在5704处,创建共享数据库容器,用于存储由多个租户使用的共享内容。在5706处,在共享数据库容器中创建第一共享表,用于存储被应用读取但不被写入的只读数据。在5708处,将数据从只读表复制到第一共享表。在5710处,从租户数据库容器中丢弃只读表。在5712处,在租户数据库容器中创建只读视图,用于提供对第一共享表的读访问。在5714处,在共享数据库容器中创建第二共享表,用于存储只读混合数据。在5716处,将只读混合数据从混合表复制到第二共享表。在5718处,从混合表中删除只读混合数据。在5720处,混合表被重命名为第二可写入表。在5722处,创建联合视图以提供对第二共享表和第二可写入表的统一访问。图58是用于交换共享数据库容器的示例方法5800的流程图。将理解的是,方法5800和相关方法可以例如通过适当的任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个来执行方法5800和相关方法,并从客户端、服务器或其他计算设备的存储器获得任何数据。在一些实施方式中,方法5800和相关方法由上面关于图1描述的系统100的一个或多个组件执行。例如,方法5800和相关方法可以由图1的部署工具130执行。在5802处,接收部署数据库系统的新版本的请求。在5804处,接收包括针对数据库系统的新版本的数据的部署包。在5806中,与当前版本的共享数据库容器并行地在数据库系统中安装下一版本的共享数据库容器。在5808处,将新版本部署到多个租户数据库容器中的每一个。将新版本部署到多个租户数据库容器中的每一个包括在5810处将多个租户数据库容器中的每一个分别链接到下一版本的共享数据库容器。该链接可以包括将每个相应租户数据库容器中的至少一个视图丢弃到当前版本共享数据库容器中的共享内容的,并且将每个相应租户数据库容器中的至少一个新视图添加到下一版本共享数据库容器中的经更新的共享内容。将新版本部署到多个租户数据库容器中的每一个包括在5812处将经改变的内容从部署包部署到每个租户数据库容器。在5814处,在已经完成到多个租户数据库容器中的每一个租户数据库容器的部署之后,当前版本的共享数据库容器被丢弃。图59是用于修补共享数据库容器的示例方法5900的流程图。将理解的是,方法5900和相关方法可以适当地例如通过任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个执行方法5900和相关方法,并从客户端、服务器或其他计算设备的存储器获得任何数据。在一些实施方式中,方法5900和相关方法由上面针对图1描述的系统100的一个或多个组件执行。例如,方法5900和相关方法可以由图1的修补系统146执行。在5902处,接收用于将数据库系统升级到第二软件版本的第一部署包。升级可以包括到共享数据库容器和一个或多个租户数据库容器的部署。在5904处,根据部署包中的信息识别完全存储在共享数据库容器中的共享对象。在5906处,确定部署包中的共享对象的第一共享内容。在5908处,识别具有共享数据库容器中的共享部分以及租户数据库容器中的租户部分的部分共享对象。在5910处,确定部署包中的部分共享对象的第二共享内容。在5912处,所确定的第一共享内容和所确定的第二共享内容被部署到共享数据库容器作为所部署的共享内容。在5914处,确定部署包中的部分共享对象的第一本地内容。在5916处,将第一本地内容部署到各个租户数据库容器。在5918处,识别不在共享数据库容器中存储数据的本地对象。在5920处,识别部署包中的本地对象的第二本地内容。在5922处,将第二本地内容部署到各个租户数据库容器。图60是用于将不同类型的改变部署到数据库系统的示例方法6000的流程图。将理解的是,方法6000和相关方法可以适当地例如通过任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个来执行方法6000和相关方法,并从客户端、服务器或其他计算设备的存储器获取任何数据。在一些实施方式中,方法6000和相关方法由上面针对图1描述的系统100的一个或多个组件执行。例如,方法6000和相关方法可以由图1的改变管理系统134执行。在6002处,针对当前版本的共享数据库容器中的每个表确定表结构和表共享类型。在6004处,针对下一版本的共享数据库容器中的每个表确定表结构和表共享类型。在6006处,将当前版本的共享数据库容器中的表的表结构与下一版本的共享数据库容器中的表的表结构进行比较以识别表结构差异。在6008处,将当前版本的共享数据库容器中的表的表共享类型与下一版本的共享数据库容器中的表的表共享类型进行比较以识别表共享类型差异。在6010处,将关联于当前版本共享数据库容器的当前键模式配置与关联于下一版本共享数据库容器的经更新的键模式配置进行比较,以识别键模式配置差异。在6012处,基于表结构差异、表共享类型差异和键模式配置差异,将至少一个租户数据库容器中的每个表升级到下一版本。图61是用于改变键模式定义的示例方法6100的流程图。将理解的是,方法6100和相关方法可以例如通过适当的任何合适的系统,环境,软件和硬件,或者系统、环境、软件和硬件的组合来执行。例如,可以使用客户端、服务器或其他计算设备中的一个或多个执行方法6100和相关方法,并从客户端、服务器或其他计算设备的存储器获得任何数据。在一些实施方式中,方法6100和相关方法由上面针对图1描述的系统100的一个或多个组件执行。例如,方法6100和相关方法可以由图1的拆分定义改变基础设施执行。在6102处,接收包括新的键模式配置的新的共享数据库容器。新的共享数据库容器是当前共享数据库容器的新版本,用于存储可由多个租户访问的数据。新的键模式配置是逻辑拆分表的当前键模式配置的新版本。逻辑拆分表包括当前共享数据库容器中的只读部分表和租户数据库容器中的可写入部分。该当前的键模式配置描述了可写入部分中包括的记录的键。新的共享数据库容器包含逻辑拆分表的经更新的只读部分,其中包括匹配新的键模式配置的补充的记录。在6104,在当前共享数据库容器中的逻辑拆分表的只读部分中识别与新的键模式配置匹配的记录。在6106,将所识别的记录从当前共享数据库容器中的逻辑拆分表的只读部分移动到被包括在租户数据库容器中的逻辑拆分表的可写入部分。在6108处,从租户数据库容器中的逻辑拆分表的可写入部分删除与新的键模式配置不匹配的记录。前面的附图和所附描述示出了示例过程和计算机可实施的技术。但是系统100(或其软件或其他组件)考虑使用、实施或执行用于执行这些和其他任务的任何合适的技术。应该理解的是,这些过程仅用于说明目的,所描述的或类似的技术可以在任何适当的时间(包括并发地、单独地或组合地)执行。另外,这些过程中的许多操作可以同时、并发和/或以不同于所示顺序的顺序进行。而且,只要方法保持适当,系统100可以使用具有附加操作、更少操作和/或不同操作的过程。换句话说,虽然已经根据某些实施例和通常关联的方法描述了本公开,但是这些实施例和方法的变更和置换对于本领域技术人员将是显而易见的。因此,示例实施例的以上描述不限定或限制本公开。其它改变、替代和变更也是可能的,而不脱离本公开的精神和范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1