2016-10-09 2 views
0

У меня есть бизнес-правило в моей базе данных, в котором говорится, что идентификатор должен соответствовать списку определенных идентификаторов, чтобы быть действительным. Я не могу использовать ограничение CHECK в этом экземпляре, так как требует подзапроса для поиска действительных идентификаторов, поэтому мне нужно использовать триггер.Выбор между триггером INSTEAD OF/AFTER и UDF

Проще говоря, для того, чтобы запись, чтобы вставить в таблицу А. Поле ИД (числовое) в таблице А должен присутствовать в таблицах B или C.

я мог однако использовать скалярную UDF, чтобы проверить если идентификатор действителен, но это похоже на нарушение функции. Я уже несколько раз делал это в своей базе данных, и хотя он работает, он просто выглядит «неправильно».

Возвращаясь к триггерам, я не могу решить, какой триггер мне понадобится использовать в этом случае, поскольку оба они работают, за исключением того, что ошибка поймана на разных этапах.

Использование триггера INSTEAD OF поймает неверный идентификатор до того, как он будет вставлен/обновлен, но код для этого триггера немного сложнее. (Принимает 12 переменных и длинный громоздкий оператор INSERT)

Триггер AFTER выполняет ту же задачу, но ошибка поймается после того, как строка вставлена, а затем операция откат.

Теперь, несмотря на то, что все три этих подхода работают, один из них должен быть более «подходящим» для задачи?

+0

Триггеры обычно используются для обновления/удаления/операций вставки, и вы хотите, чтобы проверить действительный идентификатор перед тем вкладышем. используйте UDF или подзапрос, чтобы проверить, например: if @id in (выберите myid from mytable) начало Начало --do ваша бизнес-логика end –

+0

Это то, что я делал раньше в базе данных, просто не был уверен, общепринятый способ сделать это. – Jake

ответ

1

Вы можете использовать функцию User Defined Function и инкапсулировать в нее свои коды проверки. Это должно выглядеть примерно так.

-- Create Dummy Table 
CREATE TABLE Employee 
(ID INT, Name VARCHAR(50), Age TINYINT) 
GO 

-- Function to verify age of employee 
CREATE FUNCTION dbo.verifyAge 
(@Age TINYINT) 
RETURNS BIT 
    BEGIN 
     IF (@Age IS NULL OR @Age >= 18) 
      RETURN 1 

     RETURN 0; 
    END; 

-- Add check constraint 
ALTER TABLE dbo.Employee 
    ADD CONSTRAINT Chk_verifyAge CHECK (dbo.verifyAge(Age) = 1) 
GO 
-- Test check Constraint 
INSERT INTO dbo.Employee 
     (ID, Name, Age) 
VALUES (1, 'Dummy',17) 
GO 

enter image description here

Смежные вопросы