您的位置:首页 > 数据库 > MySQL

MYSQL入门基础:数据库规则Rule

2017-03-09 16:41 1391 查看
Rule)规则 就是数据库中对存储在表的列或用户自定义数据类型中的值的规定和限制。规则是单独存储的独立的数据库对象。规则与其作用的表或用户自定义数据类型是相互独立的,即表或用户自定义对象的删除、修改不会对与之相连的规则产生影响。规则和约束可以同时使用,表的列可以有一个规则及多个CHECK 约束。规则与CHECK 约束很相似,相比之下,使用在ALTERTABLE 或CREATE TABLE 命令中的CHECK 约束是更标准的限制列值的方法,但CHECK 约束不能直接作用于用户自定义数据类型。

  9.2.1 创建规则

  (1) 用CREATE RULE 命令创建规则

  CREATE RULE 命令用于在当前数据库中创建规则,其语法如下:

  CREATE RULE rule_name AS condition_expression

  其中condition_expression 子句是规则的定义。condition_expression 子句可以是能用于WHERE 条件子句中的任何表达式,它可以包含算术运算符、关系运算符和谓词(如IN、LIKE、 BETWEEN 等)。

  注意:condition_expression子句中的表达式必须以字符“@”开头。



(2) 用Enterprise Manager 创建规则

  在Enterprise Manager 中选择数据库对象“Rules”,单击右键从快捷菜单中选择“NewRule”选项,即会弹出如图9-1 所示的创建规则属性对话框。输入规则名称和表达式之后,单击“确定”按钮,即完成规则的创建。



9.2.2 查看规则

  (1) 用Enterprise Manager 查看规则

  在Enterprise Manager 中选择“Rules” 对象,即可从右边的任务板中看到规则的大部分信息,包括规则的名称、所有者、创建时间,等如图9-2 所示。在SQL Server 2000 中不像7.0 版本可以直接在任务板中看到规则的表达式,这需要查看规则的属性。可以选择要查看的规则,单击右键,从快捷菜单中选择“Properties” 选项,即会出现如图9-3 所示的对话框,可以从中编辑规则的表达式。修改规则的名称可以通过Sp_rename 系统存储过程进行,也可以直接在图9-2 中用右键单击要修改的规则,从快捷菜单中选择“重命名(Rename)”
菜单项,进行名称修改。

  

(2) 用存储过程Sp_helptext 查看规则

  使用Sp_helptext 存储过程可以查看规则的细节,其语法如下:

  sp_helptext [@objname =] 'name'

  其中[@objname =] 'name'子句指明对象的名称,用Sp_helptext 存储过程查看的对象可

  以是当前数据库中的规则、缺省值、触发器、视图或未加密的存储过程。





例9-5: 查看规则hire_date_rule。

  exec sp_helptext hire_date_rule

  运行结果如下:

  Text

  --------------------------------------------------------------------------------------

  create rule hire_date_rule

  as @hire_date >= '1980-01-01' and @hire_date <= getdate()

  9.2.3 规则的绑定与松绑

  创建规则后,规则仅仅只是一个存在于数据库中的对象,并未发生作用。需要将规则与数据库表或用户自定义对象联系起来,才能达到创建规则的目的。联系的方法称为“绑定”。所谓绑定就是指定规则作用于哪个表的哪一列或哪个用户自定义数据类型。表的一列或一个用户自定义数据类型只能与一个规则相绑定,而一个规则可以绑定多对象,这正是规则的魅力所在。解除规则与对象的绑定称为“松绑”。

  (1) 用存储过程Sp_bindrule 绑定规则

  存储过程Sp_bindrule 可以绑定一个规则到表的一个列或一个用户自定义数据类型上。其语法如下:

  sp_bindrule [@rulename =] 'rule',

  [@objname =] 'object_name'

  [, 'futureonly']

  各参数说明如下:

  [@rulename =] 'rule'

  指定规则名称。

  [@objname =] 'object_name'

  指定规则绑定的对象。

  'futureonly'

  此选项仅在绑定规则到用户自定义数据类型上时才可以使用。当指定此选项时,仅以后使用此用户自定义数据类型的列会应用新规则,而当前已经使用此数据类型的列则不受影响。

  例9-6: 绑定规则hire_date_rule 到用户自定义数据类型hire_date 上。

  exec sp_bindrule hire_date_rule, hire_date

  运行结果如下:

  Rule bound to data type.

  The new rule has been bound to column(s) of the specified user data type.

  例9-7: 绑定规则hire_date_rule 到用户自定义数据类型hire_date 上,带'futureonly'选项。

  exec sp_bindrule hire_date_rule, hire_date, 'futureonly'

  运行结果如下:

  Rule bound to data type.

  例9-8: 绑定规则my_rule 到orders 表的字段order_id。

  exec sp_bindrule id_rule, 'orders.[order_id]'

  运行结果如下:

  Rule bound to table column.

  注意:规则对已经输入表中的数据不起作用。

  规则所指定的数据类型必须与所绑定的对象的数据类型一致,且规则不能绑定一个数据类型为TEXT、MAGE或TIMESTAMP的列。

  与表的列绑定的规则优先于与用户自定义数据类型绑定的列,因此,如果表的列的数据类型与规则A绑定,同时列又与规则B绑定,则以规则B为列的规则。

  你可以直接用一个新的规则来绑定列或用户自定义数据类型,而不需要先将其原来绑定的规则解除,系统会将早班规则覆盖。

  

(2)用存储过程Sp_unbindrule 解除规则的绑定

  存储过程Sp_unbindrule 可解除规则与列或用户自定义数据类型的绑定,其语法如下:

  sp_unbindrule [@objname =] 'object_name'

  [,'futureonly']

  其中'futureonly'选项同绑定时一样,仅用于用户自定义数据类型,它指定现有的用此用户自定义数据类型定义的列仍然保持与此规则的绑定。如果不指定此项,所有由此用户自定义数据类型定义的列也将随之解除与此规则的绑定。

  例9-9: 解除规则hire_date_rule 与用户自定义数据类型birthday 的绑定,带'futureonly'

  选项。

  exec sp_unbindrule birthday, 'futureonly'

  运行结果如下:

  (1 row(s) affected)

  Rule unbound from data type.

  (3) 用Enterprise Manager 管理规则的绑定

  在Enterprise Manager 中,选择要进行绑定设置的规则,单击右键,从快捷菜单中选择“Properties” 选项,即会出现如图9-3 所示的规则属性对话框。图中的“Bind UDTs…”按钮用于绑定用户自定义数据类型,“Bind Columns…” 按钮用于绑定表的列。

  

在图9-3 中单击“Bind UDTs…” 按钮,则出现如图9-4 所示的绑定规则到用户自定义数据类型的对话框;单击“Bind Columns…” 按钮,则出现如图9-5 所示的绑定规则到表的列的对话框。





9.2.4 删除规则

  可以在Enterprise Manager 中选择规则,单击右键,从快捷菜单中选择“Delete” 选项删除规则,也可使用DROP RULE 命令删除当前数据库中的一个或多个规则。其语法如下:

  DROP RULE {rule_name} [,...n]

  注意:在删除一个规则前,必须先将与其绑定的对象解除绑定。

  例9-10: 删除多个规则

  drop rule mytest1_rule,mytest2_rule

SQL帮助:


CREATE RULE

创建称为规则的对象。当绑定到列或用户定义数据类型时,规则将指定可以插入到列中的可接受的值。规则是一种向后兼容的功能,执行一些与检查约束相同的功能。CHECK
约束是使用 ALTER 或 CREATE TABLE 的 CHECK 关键字创建的,是对列中的值进行限制的首选标准方法(可以对一列或多列定义多个约束)。列或用户定义数据类型只能有一个绑定的规则。但是,列可以同时具有规则和一个或多个与其关联的检查约束。在这种情况下,将检查所有限制。
语法
CREATE RULE rule


AS condition_expression

参数
rule
是新规则的名称。规则名称必须符合标识符规则。可以选择是否指定规则所有者的名称。
condition_expression
是定义规则的条件。规则可以是 WHERE 子句中任何有效的表达式,并且可以包含诸如算术运算符、关系运算符和谓词(如 IN、LIKE、BETWEEN)之类的元素。规则不能引用列或其它数据库对象。可以包含不引用数据库对象的内置函数。
condition_expression 包含一个变量。每个局部变量的前面都有一个 @ 符号。该表达式引用通过 UPDATE 或 INSERT 语句输入的值。在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是 @ 符号。
注释
在单个批处理中,CREATE RULE 语句不能与其它 Transact-SQL 语句组合使用。规则不适用于在创建规则时已存在于数据库中的数据,而且规则不能绑定到系统数据类型。规则只能在当前的数据库中创建。创建规则后,执行 sp_bindrule 可将规则绑定到列或用户定义数据类型。
规则必须与列的数据类型兼容。规则不能绑定到 text、image 或 timestamp 列。一定要用单引号
(') 将字符和日期常量引起来,在二进制常量前加 0x。例如,不能将 "@value LIKE A%" 用作数字列的规则。如果规则与其所绑定的列不兼容,Microsoft® SQL Server™ 将在插入值时(而不是在绑定规则时)返回错误信息。
对于用户定义数据类型,只有尝试在该类型的数据库列中插入值,或更新该类型的数据库列时,绑定到该类型的规则才会激活。因为规则不检验变量,所以在向用户定义数据类型的变量赋值时,不要赋予绑定到该数据类型的列的规则所拒绝的值。
若要获得关于规则的报表,请使用 sp_help。若要显示某条规则的文本,请以该规则的名称作为参数来执行存储过程 sp_helptext。若要重命名规则,请使用 sp_rename。
要创建与原有规则同名的新规则,必须在创建新规则之前将原有规则除去(使用 DROP RULE),而在除去规则之前,必须首先解除绑定(使用 sp_unbindrule)。使用 sp_unbindrule 解除规则与列的绑定。
可以在不解除原有绑定的情况下将新规则绑定到列或数据类型;新规则将替代原有规则。绑定到列的规则总是优先于绑定到用户定义数据类型的规则。将规则绑定到列时,该规则将替换已经绑定到该列的用户定义数据类型的规则。但是,将规则绑定到用户定义数据类型时,该规则不会替换绑定到该数据类型的列的规则。下表显示了当将规则绑定到已经存在规则的列和用户定义数据类型时,规则生效的优先顺序。

旧规则绑定到
新规则绑定到用户定义数据类型
用户定义数据类型旧规则被替换没有变化
旧规则被替换旧规则被替换
如果列同时有默认值和规则与之关联,则默认值必须满足规则的定义。与规则冲突的默认值永远不能插入列。每次试图插入这样的默认值时,SQL Server 都会生成错误信息。

说明 SQL Server 是将空字符串解释为单个空格还是真正的空字符串取决于 sp_dbcmptlevel 的设置。如果兼容级别小于或等于 65,SQL Server 就将空字符串解释为单个空格。如果兼容级别等于 70,则 SQL Server 将空字符串解释为空字符串。有关更多信息,请参见 sp_dbcmptlevel

权限
CREATE RULE 权限默认授予 sysadmin 固定服务器角色成员和 db_ddladmin 和 db_owner 固定数据库角色成员。sysadmin、db_owner 和 db_securityadmin 角色的成员可以将权限转让给其他用户。
示例
A. 范围规则
下例创建一个规则,用以限制插入该规则所绑定的列中的整数范围。
CREATE RULE range_rule
AS
@range >= $1000 AND @range < $20000

B. 列表规则
下例创建一个规则,用以将输入到该规则所绑定的列中的实际值限制为只能是该规则中列出的值。
CREATE RULE list_rule
AS
@list IN ('1389', '0736', '0877')

C. 模式规则
下例创建一个遵循这种模式的规则:任意两个字符的后面跟一个连字符和任意多个字符(或没有字符),并以 0 到 9 之间的整数结尾。
CREATE RULE pattern_rule
AS
@value LIKE '_ _-%[0-9]'

 [/code]
可以用以下规则防止数据库注入<script>脚本.

规则:create rule R_test
as
not patindex('%script%',@col)>0
sp_bindrule 'R_test', 'tb.colname' 无法将规则绑定的类型:无法将规则绑定到计算列或以下数据类型的列: text、ntext、image、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、xml 或 sqlclr 类型。
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: