【问题标题】:Trigger For prevent inserting data According to a condition触发器用于防止插入数据根据条件
【发布时间】:2014-12-26 16:39:06
【问题描述】:

我需要一个触发器来防止某些数据插入表中根据条件,在像这段代码一样在表中插入任何行之前

create Trigger trigger_name 
on table_name
for insert
AS
Begin
if (true)
    insert into table_name values ()
End

【问题讨论】:

  • 请不要将相同的问题发布到网络中的多个站点。这是also posted to Database Administrators
  • 另外:你试过什么?并且您需要提供更多详细信息,例如是否需要按行评估此条件。很多人错误地假设触发器每行触发,而实际上它触发每条语句 - 一条语句可以影响多行。那么是否要插入符合条件的行,而丢弃不符合条件的行呢?或者检查条件,如果为真则插入所有行,否则不插入行?

标签: sql sql-server tsql triggers


【解决方案1】:

使用Instead Of Insert triggerexists运算符验证满足条件的行

CREATE TRIGGER trigger_name
ON table_name
Instead OF INSERT
AS
  BEGIN
      INSERT INTO table_name
      SELECT *
      FROM   inserted
      WHERE  EXISTS (SELECT 1
                     WHERE  condtion = true)
  END 

【讨论】:

    【解决方案2】:

    Instead of Trigger(使用 INSTEAD OF CLAUSE)

    这种类型的触发器在 SQL Server 开始执行之前触发 触发它的动作。这与 AFTER 触发器不同,后者 在导致它触发的动作之后触发。我们可以有一个 INSTEAD 成功执行的表上的 OF 插入/更新/删除触发器 但不包括对表的实际插入/更新/删除。

    语法:

    CREATE TRIGGER trigger_nameON {table|view} 
    [WITH ENCRYPTION|EXECUTE AS] 
    {FOR|AFTER|INSTEAD OF} 
    {[CREATE|ALTER|DROP|INSERT|UPDATE|DELETE ]} 
    [NOT FOR REPLICATION] 
    AS sql_statement [1...n ] 
    

    触发器应该是这样的

    CREATE TRIGGER trigger_name 
    ON table_name 
    instead OF INSERT 
    AS 
        BEGIN 
            IF (true) 
                INSERT INTO table_name VALUES () 
        END
    

    【讨论】:

      【解决方案3】:

      您是否尝试过使用检查约束而不是触发器? 这是他们的预期目的。应用简单的条件来防止插入/更新不符合您的业务逻辑的数据。

      http://www.techonthenet.com/sql_server/check.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        相关资源
        最近更新 更多