电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

利用SET选项提高客户端的灵活性


发布日期:2018/7/10
 

通常情况下利用客户端连接到SQL Server数据库的时候其默认是采用服务器的相关配置来初始化客户端的连接但是在某些情况下数据库管理员希望客户端能够管理自己的设置而且往往这些客户端的设置跟服务器的设置不一样甚至相反此时客户端要能够在不修改服务器设置的情况下连接到数据库服务器中

要实现类似的功能就需要用到SQL Server数据库中的SET选项如要实现上述的需求数据库管理员可以把SET ANSI_DEFAULTS ON然后再通过SQL_COPT_SS_PRESERVE_CURSORS来设置客户端的配置如此的话就可以实现客户端与服务器配置的不同提高客户端配置的灵活性

不过需要注意的是使用这些SET选项会导致客户端与服务器配置的不同即一些连接参数运行环境等等可能会出现混乱为此在使用SET选项时还必须考虑这个一致性的问题也就是说使用SET选项时要注意如下细节

SET选项的生效时间

利用SET选项来设置相关的运行参数与环境的时候要注意其生效时间这与服务器默认参数不同默认参数其是始终生效的除非后来数据库管理员改变了其设置但是使用SET选项来设置相关参数时其生效时间就尤其特殊性一般来说SET选项可以分为分析时SET选项与执行时SET选项随着他们的分类不同这个选项的生效时间也是不同的如分析时选项在分析期间分析出文本中的选项时生效而不管是否受流语句的控制而执行选型则在指定这些选项的代码执行期间生效如在一个批处理程序中可以设置一个SET选项如果在执行这个SET语句之前批处理程序已经因为某些原因执行失败则这个选项就不会生效即数据库系统没有设置这个选项如果在执行SET语句后执行失败则这这个选项就已经生效了

所以说如果SET选项跟一些批处理程序一起使用时就需要特别注意这个SET选项的位置因为这个SET选型是否生效直接跟批处理程序中其他语句的执行情况相关如现在一个批处理程序中有条语句而SET选型就是其中的一条如在第五条如果在执行这个批处理程序的时候在第三条语句的时候卡住了那么这个第五条的SET选项语句就根本不起作用为此笔者建议数据库管理员像这些SET选项语句通常情况下最好放置在批处理程序的前面部分以初始化批处理程序的相关运行环境除非有特别的需要否则的话不要放置在中间

要注意SET选项的作用范围

其实SET选项设置的参数与数据库服务器的默认参数就好像是一个局部变量与全局变量的关系前者设置的参数就是一个局部变量其只有在一个特定的范围内有效;离开了这个范围的话就会失效而全局变量的话通常情况下都是有效的除非在某个领域内又对其重新赋值了所以说数据库管理员必须要了解SET选型的作用范围为后续引用这些参数做好准备具体来说这些SET选项往往跟不同的功能结合使用如跟批处理程序跟触发器等等结合使用而随着这个使用范围的不同其作用范围也是不同的

在会话过程中有效有些SET选项是专门针对客户端连接的如笔者刚开始提起过的那个SET选型其就是专么用来设置客户端的连接参数的这些参数可能跟服务器的默认参数之间存在着比较大的差异那么这些参数的作用范围是多少呢?通常情况下针对专门会话所这支的SET选项其在重置或者服务器中用户的会话终止之前有效也就是说在客户端连接的初始化过程中SET选项生效只要用户的这个会话没有终止这些选项都是生效的除非用户终止了当前的会话或者服务器强制重置相关参数否则的话这个SET选项随着会话启用而生效随着会话终止而失效另外需要注意的是针对某个用户设置的SET选项其只对这个用户的会话有效而不会影响到其他用户跟数据库之间的通信

支持 MARS 的连接维护一组默认的 SET 选项值在该连接下执行批处理时将把默认的 SET 选项值复制到请求的环境批处理结束后该环境将复制回会话的默认设置通过这种方法在同一连接下同时执行的多个批处理将在独立的 SET 选项环境下运行这是一个官方的说明他是什么意思呢?也就是说在同一个连接的过程中可能会执行多个批处理作业如果在这些批处理作业中没有设置SET选项的话则其默认会采用服务器的默认设置但是如果在第一个批处理程序中采用了SET选项更改这个默认设置那么在第一个批处理程序运行环境中就会采用这个SET选项的设置从而可以根据企业实际的需求在同一个连接下为每个批处理程序设置相对独立的运行环境在支持 MARS 的连接下如果同时执行多个批处理且它们会修改批处理执行环境则得到的默认连接环境取决于最后执行完的批处理也就是说最后这个连接的参数取决于最后运行的皮处理程序中的SET选项简单的说除非当前的连接中断掉或者服务器实现强制重置否则的话当前连接中的相关参数会被批处理程序中的SET选项改变而且这个值会被多次改变最后的参数是有最后一个批处理程序中的SET选项所决定

在触发器或者过程中也可以使用SET选项那么跟他们结合使用时SET选项的寿命又有多少呢?这要分情况来对待一是要看触发器或者过程内容有没有多次使用SET选项如在触发器中可能一开始就利用SET选项设置了某个参数;然后某个功能执行完毕后又把这个参数恢复了默认值再继续执行剩下的功能在这种情况下其有效持续时间就是触发器内部这个参数被重置之前也就是说在一个触发器或者内部可以先打开某个选项然后再关闭掉那么只有在这个选项打开与关闭之前有效二是如果在触发器内部一开始启用了某个SET选项后来没有把他关闭掉那么这个选项也不会永远生效下去通常情况下只要当前这个触发器或者过程执行完毕后这个SET选型就会失效为此简单的说这个SET选项就好象是存储器或者过程中的局部变量其只在触发器或者过程的内部生效

如果一个过程A调用了另外一个过程B而现在如果过程A中利用SET选项更改了某些参数那么这个更改会否影响到过程B的运行环境将呢?答案是不确定这主要是看过程B中有没有对这个SET选型进行重新设置也就是说除非在过程B中进行了显示的重置否则来自所有更高级别的代码中的SET选项值在低级别的代码中有效简单的说过程A调用了过程B则过程A中的SET选项值在过程B中同样有效除非过程B显示的对这SET选型进行了重置其实这个原理很简单就好象在过程A中定义了一个变量然后调用了过程B此时过程B使用需要用到这个过程A中定义的变量时他的值就是在过程A中修改后的值当然在过程B中也可以对这个过程A中定义的变量值进行修改如可以对这个变量的值进行重置不过当这个过程A结束时这个变量就会失效了

可见这个SET选项跟程序开发过程中的局部变量与全局变量非常的相似数据库管理员在使用这些SET选项的时候需要注意一个基本的原则即其作用范围往往只在当前的会话或者过程中有效为此数据库管理员在启用某个SET选项的时候就需要考虑一个问题即这个改变只是针对某个特定的会话或者某个特定的作业还是针对全部用户?如果是前者的话则可以通过SET选项来设置但是如果是后者的话那么最好通过服务器设置来改变否则的话要为每个会话或者每个作业设置SET选型那工作量就比较大了笔者以前学过程序开发为此来学些这个SET选型的时候比较喜欢利用全局变量与局部变量的关系来了解这个功能全局变量即在整个运行环境中都有效;而局部变量则只在某个作用范围内有效就是如此简单而已掌握了这个SET选项的作用范围之后就可以帮助数据库管理员来确定到底是否该采用SET选项以及在什么时候采用这个SET选项来提高客户端连接以及用户运行环境的灵活性

上一篇:表中出现Block错误的恢复方法及具体步骤[2]

下一篇:讲解Informix Dynamic Server的权限设置[1]