在这篇文章中,最初由格伦·保利撰写并发布到sybase.com网站2009年9月,Glenn讨论了如何在SQL Anywhere中使用选项,包括创建和设置自定义选项的能力,以及监视和防止用户更改选项的能力。
在SQL Anywhere、服务器、数据库中,连接级别选项提供了对各种行为的应用程序控制,这些行为可能会影响服务器操作和/或应用程序可见语义。"在sqlanywhere中实现的"选项"不是isosql标准的一部分,尽管在SQL标准过程中已经讨论了支持"全局变量"的概念。SQL Anywhere选项与单独的机制一起实现"全局变量"来更新和检索它们的值。
SQL Anywhere服务器选项持久存储在系统目录中,可以使用SYSOPTION视图查看:
服务器定义的选项是类型化的:一些是二进制设置(开与关),一些是整数,有些是特定的字符串设置,有些是自由格式的字符串。选项的"魔力"在于每个系统选项都有一个默认值-公共设置-对于许多选项,用户甚至特定连接都可以永久或临时地覆盖该值。在上图中,请注意每个选项及其设置都属于特定的用户;在演示数据库中,user\ id"2"是用户PUBLIC。其他用户的特定选项设置也与各自的用户ID一起保存在目录中。这些设置"覆盖"该用户的公共设置;如果用户设置不存在,则使用公共设置作为默认设置。
例如,默认情况下,阻塞选项的公共设置为"开",这意味着SQL请求在与行锁冲突时将被阻塞。如果希望SQL语句失败并出现错误,而不是阻塞,可以将阻塞选项设置为OFF。通过SET option语句更改选项设置,如下所示:
更改此用户的阻塞选项设置,并对数据库目录进行此修改。正如SQLAnywhere帮助中所解释的,某些选项存在时间依赖性:
更改连接选项(如阻塞)通常会影响与该用户标识连接的新连接,当然也会影响发起更改的连接,但不会影响其他现有连接。如果需要,可以临时为当前连接设置该选项;该设置保留在内存中,不会持久化到数据库目录。临时更改选项使用临时关键字:
由于此临时设置不是持久的,因此必须通过其他方式查询其值。在DBISQL中,可以使用SET DBISQL命令显示此连接的所有服务器定义选项的当前值(临时值或其他值)。在下图中,注意BLOCKING选项的值现在设置为OFF:
如果不使用DBISQL,可以使用系统过程sa\u conn\u properties()查询这些值,除了返回所有服务器定义的连接选项的选项设置外,还返回可以使用的各种连接相关计数器出于诊断目的:
可以使用Connection_PROPERTY()函数单独查询连接属性(包括选项)。注意,SQLAnywhere将服务器定义的选项分为三类:连接、数据库和服务器。分别使用CONNECTION\u PROPERTY()、DB\u PROPERTY()和PROPERTY()函数查询这些属性。对于选项,即使临时设置,这些属性函数也会返回其当前值。临时设置公共选项,物联网设备,即
更改其值,直到数据库关闭,所有新连接都将继承此设置(除非为该用户重写此设置)。重新启动数据库时,SYSOPTION视图中的持久值将再次用作默认值。
SQL Anywhere中的选项是一种通用机制;虽然系统定义的选项更为常见,但任何应用程序都可以建立一个用户定义的选项来存储"全局变量"。要建立用户定义的选项,具有DBA权限的用户必须发出SET option语句来为公共用户设置选项的值。
例如,下面的语句创建用户定义的选项"foo":
选项"foo"现在永久存储在目录中。一旦一个选项公开了,我们就可以走了。如果作为用户DBA,大数据的前景,大数据的,我们决定为"foo"设置自己的值,我们可以用:
覆盖公共设置,现在这两个值在SYSOPTION视图中都可见(userid"1"是DBA):
用户定义的选项值是VARCHAR字符串–它们的键入方式与系统定义的选项不同。用户定义选项的最大长度取决于数据库页大小;对于4K页(默认值),最大长度为3468字节。不幸的是,用户定义的选项不会由sa\u conn\u properties()返回,也不能通过connection\u property()函数查询。对于大多数接口,查询其值的唯一方法是对SYSOPTION目录视图执行SQL查询。但是,如果您的应用程序使用嵌入式SQL,个人免费云服务器,则可以使用嵌入式SQL的GET OPTION语句检索任何选项的选项值,包括用户定义的选项。
最后,我想指出10.0.1 SQL Anywhere版本中首先添加的一个功能,旨在帮助从一个SQL Anywhere版本迁移到另一个SQL Anywhere版本。该功能能够添加"监视"来检测和拒绝(或报告)对选项设置的更改。这是通过sa_server_option()系统过程的两个参数完成的:OptionWatchList和OptionWatchAction。通过指定OptionWatchList,可以指定要监视的选项(服务器或用户定义的)。OptionWatchAction指示要执行的操作:消息(导致消息出现在服务器控制台窗口中)或错误(导致SET OPTION语句返回错误而不是修改选项值)。
例如,假设在创建用户定义的选项"foo"之后,我们希望禁止对其值进行任何更改。我们首先按如下方式设置手表:
,然后指定所需操作:
此手表就位后,南昌大数据,任何修改选项的尝试都会导致错误: