使用触发器删除

时间:2018-04-04 14:12:17

标签: sql sql-server

我每周导入一次电子表格,其中充满了我们作为公司所做的所有培训,其中一些是强制性的,其中一些不是。我是否能够触发摆脱强制性培训。

delete from [import training]
where module not in ('Mandatory Training 1','Mandatory Training 2' etc...)

作为代码看起来像什么的示例,但是当我有正确的语法时它会作为触发器吗?

2 个答案:

答案 0 :(得分:0)

为什么删除强制性培训?

相反,创建一个视图:

create view optional_training as
    select t.*
    from [import training] t
    where t.module not in ('Mandatory Training 1','Mandatory Training 2' etc...);

然后,有人可以查询视图以获得可选的培训。他们可以查询基表以获得所有培训。

答案 1 :(得分:0)

是的,它会起作用,但首先考虑以下选项:

  • 在插入之前过滤数据。
  • 仅使用可接受的值实施CHECK约束。这将强制所有非有效值被整个插入/更新拒绝。
  • 保留所有数据,但在您访问时会过滤,条件为WHERE或视图。

如果前面的选项不合适,那么您可以像Jeroen一样创建一个INSTEAD OF触发器,它将使用有效值重写插入操作。您还需要考虑此字段的更新。

CREATE TRIGGER OnlyMandatoryTrainings ON [import training] 
    INSTEAD OF INSERT
AS
BEGIN

    SET NOCOUNT ON

    INSERT INTO [import training] (
        module 
        -- All remaining columns
        )
    SELECT
        module
        -- All remaining columns
    FROM
        inserted AS I
    WHERE
        I.module IN ('valid value 1', 'valid value 2')

END

使用触发器来实现业务逻辑并不是一种好的做法,尽管偶尔可能会有一些例外。我会尝试尽可能地避免它们,如果不是那么问题,例如"我的行没有被插入但是插入没有失败"就产生了。