如何正确编写sql触发器

时间:2014-08-11 16:55:25

标签: sql-server

我想添加一个触发器而我从未写过一个。 当我更新或向表添加新值时,我想检查是否允许某个值。 我开始触发但我真的不知道如何结束它:

CREATE TRIGGER isAguide
ON tblDiving 
AFTER INSERT, UPDATE AS
BEGIN
DECLARE @Found bit
select @Found = count(*)
from tblAuthorized 
WHERE diver_number = @id 
    and level_name = 'guide'

如果@ found = 1,我想允许添加。 @id是用户尝试添加到表中的值。 首先,我如何获得用户在此ID'中输入的值。柱? 第二,我如何继续我写的触发器? 我选择AFTER INSERT后可以吗? 我想添加类似的内容:

if(@found=1) THEN allow adding/updating
else don't allow. 

2 个答案:

答案 0 :(得分:2)

如果您正在使用AFTER触发器,则可以抛出错误并在找不到ID时回滚事务。

CREATE TRIGGER isAguide
ON tblDiving AFTER INSERT, UPDATE AS
BEGIN
    DECLARE @Found bit, @id int;

    SET @id = SELECT id FROM inserted;
    SET @Found = 
        (
        SELECT count(*)
        FROM tblAuthorized 
        WHERE diver_number = @id 
        AND level_name = 'guide'
        );

    IF @Found = 0
    THEN
       RAISERROR ('The ID entered is not valid', 16, 1);
       ROLLBACK TRANSACTION;
       RETURN 
    END;
END;

答案 1 :(得分:1)

我建议创建一个单独的表“Guides”而不是编写触发器,其中潜水员编号作为唯一的列(作为主键)。 将外键引用添加到tblDiving表的相关Id列。

这不仅符合规范化的数据结构,而且速度也会更快。

最后,您需要考虑在将某些行插入tblDiving表后将diver_number的level_name从'guide'更改为不同的情况。您希望应用程序如何做出反应?