把数据库想象成一个很大的对象——在每次调用它之后,它应该处于逻辑一致的状态。
数据库通过表暴露自己,并且可以使用触发器来保持表和行的一致性。保持它们一致的另一种方法是禁止直接访问表,并且只允许通过存储过程和视图进行访问。
触发器的缺点是任何动作都可以调用它们;这也是一种优势——没有人会因为无能而破坏系统的完整性。
作为对立面,仅允许通过存储过程和视图访问数据库仍然允许后门访问权限。信任具有足够权限的用户不会破坏数据库完整性,所有其他用户都使用存储过程。
至于减少工作量:数据库在不必与外部世界打交道时效率惊人;您会非常惊讶甚至进程切换会损害性能。这是存储过程的另一个优点:而不是对数据库的十几个调用(以及所有相关的往返),有一个。
将东西堆放在一个存储过程中很好,但是当出现问题时会发生什么?假设您有 5 个步骤,但第一步失败了,那么其他步骤会发生什么?您需要在其中添加一大堆逻辑来满足这种情况。一旦你开始这样做,你就失去了在那种情况下存储过程的好处。
业务逻辑必须去某个地方,并且在数据库的设计中嵌入了许多隐含的域规则——关系、约束等是对业务规则进行编码的一种尝试,例如,用户只能有一个密码。假设您已经开始通过这些关系等将业务规则推送到数据库服务器上,那么您在哪里划清界限?数据库何时放弃对数据完整性的责任,并开始信任调用应用程序和数据库用户来正确处理数据?嵌入了这些规则的存储过程可以将大量政治权力推到 DBA 手中。这取决于您的 n 层架构中将存在多少层;如果有表示层、业务层和数据层,业务和数据的分离在哪里?业务层增加了什么附加值?您会将数据库服务器上的业务层作为存储过程运行吗?
是的,我认为必须绕过触发器意味着您“做错了”;在这种情况下,触发器不适合您。