问题描述:

当 sp_executesql 或 EXECUTE
语句执行字符串时,字符串将作为它的自包含批处理执行。
SQL Server 会将字符串中的一个或多个 Transact-SQL
语句编译为独立于批处理(包含 sp_executesql 或 EXECUTE
语句)执行计划的执行计划。

这次我们要探索更精细的binlog内容,上次讨论的Query_event和Rows_event肯定有让你疑惑不解的问题。Query_event中的status-vars环境变量有哪些,Rows_event的数据类型是什么,元数据又是个什么鬼东西,今天我们就来一一解答。

今天给 WIN 7 SP1 操作系统安装 SQL Server 2014 ,报错找不到vc_red.msi

跟权限有什么关系?也就是说通过 sp_executesql 或
EXECUTE执行的sql被编译为独立的批处理,并不是当前用户可以直接执行的,还是通过问题来说明吧。

一、Query_event中的令人费解的status-vars

 

 

status-vars据说是为了兼容低版本的mysql服务器而加入的环境变量设置,告诉低版本的mysql服务器sql语句是在什么环境下执行的

(图片来源网络,请忽略2012字样。。)

创建用户

具体的格式是状态枚举值+状态参数 

 

直接上例子,创建一个用户,通过一个用户执行非动态sql的存储过程和动态sql的存储过程看这其中的权限问题

下面以状态枚举值分别讲下比较重要的几个状态:

问题解决:

图片 1

(1)0x00 Q_FLAGS2_CODE 4个字节

1、由于安装程序提示10.0.40219的x86和x64,从微软官方下载

 

这个主要是对于SQL_AUTO_IS_NULL、FOREIGN_KEY_CHECKS、UNIQUE_CHECKS、AUTOCOMMIT的设置,SQL_AUTO_IS_NULL是自动填充NULL,FOREIGN_KEY_CHECKS是外键检查,UNIQUE_CHECKS是唯一键索引检查,AUTOCOMMIT就是自动提交,在此处SQL_AUTO_IS_NULL
= 1,其他均为0。

 

以新创建用户的身份执行非动态sql和动态sql的存储过程

(2)0x01 Q_SQL_MODE_CODE 8个字节

创建一个非动态sql的存储过程,授权给ReadWriteUser执行这个存储过程的权限

这里的配置要参考SET sql_mode

图片 2

对应的状态列表可以参考

 

以ReadWriteUser这个用户的身份执行存储过程TestPrivilege_NoDynamic,没有问题

可以参考下面的中文翻译:

 

图片 3

1)单项模式:

Microsoft Visual C++ 2010 Redistributable Package(32位)和x64
(64位)两个安装包,

 

  1. ALLOW_INVALID_DATES:该项如果设置,mysql对于日期的月month和日day进行检查。任何日期只要满足0<month<13
    , 0<day<32的整数就能成为插入值。
  2. ANSI_QUOTES:
    如果设置该项,mysql会将引号“”’”作为引号来看待,而不是字符串符号。
  3. ERROR_FOR_DIVISION_BY_ZERO:该项如果设置,mysql会将任何数除以0以后的数以NULL的形式插入。
  4. HIGH_NOT_PRECEDENCE:该项如果设置,not运算符的优先值会被下降,如mysql会将NOT
    a BETWEEN b AND c 解析成NOT (a BETWEEN b AND c)
  5. IGNORE_SPACE:该项如果设置,mysql会允许函数名和“(”能有空格。
  6. NO_AUTO_CREATE_USER:该项如果设置,mysql会防止在grant语句执行时自动生成新用户。
  7. NO_AUTO_VALUE_ON_ZERO:该项如果设置,mysql在处理AUTO_INCREMENT列时,仅仅只对null生成下一个序列号。
  8. NO_BACKSLASH_ESCAPES:该项如果设置,mysql不能使用”\”作为转义字符。
  9. NO_DIR_IN_CREATE:该项如果设置,在建表时mysql会忽略所有的INDEX
    DIRECTORY 和DATA DIRECTORY。
  10. NO_ENGINE_SUBSTITUTION:该项如果设置,在CREATE TABLE 或ALTER
    TABLE时mysql会对无法使用的引擎报错,但不做实际的操作。
  11. NO_FIELD_OPTIONS仅对SHOW CREATE TABLE命令有效。
  12. NO_KEY_OPTIONS同上。
  13. NO_TABLE_OPTIONS同上。
  14. NO_UNSIGNED_SUBTRACTION:如果该项设置,mysql会在对负数更新到unsingned
    int数上不进行限制。
  15. NO_ZERO_DATE:如果该项设置,并且严格的SQL模式设置,mysql对于日期是0000-00-00不能插入更新。
  16. NO_ZERO_IN_DAT:如果该项设置,并且严格的SQL模式设置,mysql对于日期有0值的(除了0000-00-00)不能插入更新。
  17. ONLY_FULL_GROUP_BY在5.75新增,对本次开发没有影响。
  18. PAD_CHAR_TO_FULL_LENGTH:如果该项设置,mysql不会在检索回收多余的char空间。
  19. PIPES_AS_CONCAT:如果该项设置,mysql将把||看成CONCAT()。
  20. REAL_AS_FLOAT:如果该项设置,mysql将把REAL看成FLOAT。
  21. STRICT_ALL_TABLES:该项如果设置,mysql会进入严格的sql模式。
  22. STRICT_TRANS_TABLES:
    该项如果设置,mysql会进入严格的sql模式,仅对事务有效。

解压缩下载好的vcredist_x86.exe和vcredist_x64.exe,根据提示把SQL Server
安装程序指向这个两个文件夹,仍然报错“不是Microsoft Visual C++ 2010
Redistributable -10.0.40219 有效的安装程序包”

新创建一个以sp_executesql执行动态sql的存储过程,同样授权给ReadWriteUser这个存储过程的执行权限

2)混合模式:

 

图片 4

  1. ANSI:该项如果设置,和REAL_AS_FLOAT, PIPES_AS_CONCAT,
    ANSI_QUOTES, IGNORE_SPACE等价,在

  2. DB2:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE,
    NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS一起设置等价。

  3. MAXDB:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES,
    IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS,
    NO_AUTO_CREATE_USER一起设置等价。

  4. MSSQL:该项如果设置, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE,
    NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. 一起设置等价。

  5. TRADITIONA:该项如果设置,与STRICT_TRANS_TABLES,
    STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE,
    ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,
    NO_ENGINE_SUBSTITUTION

  6. POSTGRESQL:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES,
    IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS,
    NO_FIELD_OPTIONS一起设置等价。

  7. ORACLE:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES,
    IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS,
    NO_FIELD_OPTIONS一起设置等价。

  8. MYSQL323:仅对SHOW CREATE TABLE有影响。

  9. MYSQL40:同上。

 

以ReadWriteUser这个用户的身份执行存储过程TestPrivilege_WithDynamic,此时是执行失败的,即便是ReadWriteUser具有执TestPrivilege_WithDynamic这个存储过程的权限

(3)0x02 Q_CATALOG 

(图片来源网络,请忽略2012字样。。)

图片 5

默认记录为”\x3std\x0″,即mysql服务器所使用的目录。一字节长度+NULL字符串

 

  此时如果给ReadWriteUser授权表上的读的权限:grant select on T1 to
ReadWriteUser,再次执行TestPrivilege_WithDynamic
  然后再执行存储过程,是没有问题的

(4)0x03 Q_AUTO_INCREMENT 

2、看有的网友说, 手工安装两个vc_red.msi ,再运行SQL Server
安装程序即可。试了仍然不行。

图片 6

与AUTO_INCREMENT有关,4字节,前2个字节表示AUTO_INCREMENT,后2个字节表示AUTO_INCREMENT_OFFSET

发表评论

电子邮件地址不会被公开。 必填项已用*标注