采集自动组合(约束和触发器在特殊情况下的各有优势。(一))

优采云 发布时间: 2022-01-26 15:17

  采集自动组合(约束和触发器在特殊情况下的各有优势。(一))

  约束和触发器在特殊情况下各有优势。触发器的主要好处是它们可以收录使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但这并不总是提供给定功能的最佳方法。实体完整性应始终通过作为 PRIMARY KEY 和 UNIQUE 约束的一部分或独立于约束创建的索引在最低级别强制执行。域完整性应该通过 CHECK 约束来强制执行,而参照完整性 (RI) 应该通过 FOREIGN KEY 约束来强制执行,假设功能可以满足应用程序的功能需求。当约束支持的功能不能满足应用程序的功能需求时,触发器非常有用。

  例如:除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能验证具有与另一列中的值完全匹配的值的列值。

  CHECK 约束只能针对逻辑表达式或同一张表中的另一列验证列值。如果应用程序需要针对另一个表中的列验证列值,则必须使用触发器。约束只能通过标准系统错误消息传递错误消息。如果应用程序需要(或受益于)自定义信息和更复杂的错误处理,则必须使用触发器。

  触发器可以通过数据库中的相关表级联更改;但是,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以抑制或回滚违反参照完整性的更改,从而取消尝试的数据修改。当外键更改并且新值与主键不匹配时,此类触发器可能会发挥作用。例如,您可以在 titleauthor.title_id 上创建插入触发器,如果​​新值与titles.title_id 中的值不匹配,则回滚插入。但是,通常为此目的使用外键。

  如果触发器表上存在约束,则会在 INSTEAD OF 触发器执行之后但在 AFTER 触发器执行之前检查它们。如果约束被破坏,INSTEAD OF 触发器操作将回滚并且不执行 AFTER 触发器。

  最后可以在视图上创建触发器吗?在 SQL Server™ 联机丛书中,并没有说不能在视图上创建触发器,在语法解释中指出它可以是 CREATE TRIGGER 为 ON 后的视图。然而,情况似乎并非如此,许多专家还表示,不能在视图上创建触发器。我也专门做了个测试,是真的,不管是普通视图还是索引视图,都不可能在上面创建触发器,是真的吗?

  但这并没有什么问题:在临时表或系统表上创建触发器时,触发器将被拒绝。

  深入理解FOR CREATE TRIGGER语句后可以跟INSERT、UPDATE、DELETE中的一种或多种,​​即在其他情况下不会触发触发器,包括SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。

  相关内容 一个有趣的应用我们看到很多注册系统注册后是不能更改用户名的,但这多是由应用决定的,如果直接打开数据库表更改,也可以更改其用户名,在触发器中使用回滚,可以巧妙的实现不能更改用户名... 详情 当触发器的内部语句失败... 这种情况下,之前的数据更改操作将失效。例如,当向表中插入数据时触发触发器,并且触发器内部发生运行时错误,将返回错误值并拒绝之前的数据插入。不能在触发器中使用的语句 大多数 T-SQL 语句都可以在触发器中使用,但以下某些语句不能在触发器中使用。

  CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。

  ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。

  DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。

  DISK语句,如:DISK INIT、DISK RESIZE。

  LOAD 语句,如:LOAD DATABASE、LOAD LOG。

  RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。

  重新配置

  TRUNCATE TABLE 语句不能在 sybase 触发器中使用!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线