Ответ 1
Я бы использовал триггер для Insert.
Просто проверьте, назначено ли значение, а если нет, пойдите, возьмите правильный и используйте его.
Я работаю со старой базой данных SQL 2000, и у меня нет большого опыта SQL под моим поясом. Когда новая строка добавляется в одну из моих таблиц, мне нужно назначить значение времени по умолчанию, основанное на столбце для рабочей категории.
Например, рабочая категория A назначает значение времени 1 час, категория B - 2 часа и т.д.
Он должен устанавливать значение только в том случае, если пользователь не вручную вводит время, необходимое для выполнения этой работы. Я думал об этом с ограничением по умолчанию, но я не думаю, что это сработает, если значение по умолчанию имеет зависимость.
Каким будет лучший способ сделать это?
Я бы использовал триггер для Insert.
Просто проверьте, назначено ли значение, а если нет, пойдите, возьмите правильный и используйте его.
Используйте триггер, предложенный Стивеном Райтоном:
CREATE TRIGGER [myTable_TriggerName] ON dbo.myTable FOR INSERT
AS
SET NOCOUNT ON
UPDATE myTable
SET
timeValue = '2 hours' -- assuming string values
where ID in (
select ID
from INSERTED
where
timeValue = ''
AND workCategory = 'A'
)
Обязательно напишите триггер, чтобы он обрабатывал многострочные вставки. Не обрабатывайте одну строку за раз в триггере или предполагайте, что во вставленной таблице будет только одна строка.
Если вы хотите определить определение столбца на основе другого столбца, вы можете сделать что-то вроде этого:
create table testable
(
c1 int,
c2 datetime default getdate(),
c3 as year(c2)
);
insert into testable (c1) select 1
select * from testable;
Ваш результирующий набор должен выглядеть следующим образом:
c1 | c2 | c3
1 | 2013-04-03 17:18:43.897 | 2013
Как вы можете видеть, AS (в определении столбца) делает трюк;) Надеюсь, что это помогло.
Да, триггер.
Естественно, вместо жесткого кодирования по умолчанию вы будете искать их из таблицы.
Расширяясь на этом, ваша новая таблица становится таблицей work_category (id, name, default_hours), а исходная таблица поддерживает внешний ключ, преобразуя fom (id, work_category, hours) до (id, work_category_id, hours).
Так, например, в таблице TAG (где теги применяются к сообщениям), если вы хотите считать один тег другим... но по умолчанию для подсчета новых тегов как самих себя, у вас будет такой триггер:
CREATE TRIGGER [dbo].[TR_Tag_Insert]
ON [dbo].[Tag]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.Tag
SET [CountAs] = I.[ID]
FROM INSERTED AS I
WHERE I.[CountAs] IS NULL
AND dbo.Tag.ID = I.ID
END
Как правило, я уклоняюсь от триггеров. Почти все dbms имеют некоторую поддержку ограничений.
Мне легче их понять, отладить и поддерживать.
Я могу думать о двух путях:
Триггеры, кажется, здесь хорошо объяснены, поэтому я не буду подробно останавливаться. Но обычно я стараюсь держаться подальше от триггеров для такого рода вещей, поскольку они более подходят для других задач.
"значение по умолчанию или привязка" может быть достигнуто путем создания функции, например.
CREATE FUNCTION [dbo].[ComponentContractor_SortOrder] ()
RETURNS float
AS
BEGIN
RETURN (SELECT MAX(SortOrder) + 5 FROM [dbo].[tblTender_ComponentContractor])
END
И затем установив "значение по умолчанию или привязку" для этого столбца ([dbo].ComponentContractor_SortOrder)