SQL Server - обновить запись базовой таблицы из представления ПОСЛЕ ВСТАВКИ

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

Я в основном новичок в SQL, так что терпите меня, и я также работаю с базой данных SQL Server 2008 R2, разработанной не мной, я просто пытаюсь получить данные из нее для других целей, я также использую SQL Server Management Studio (SSMS ).

НАСТРОЙКА: существует много таблиц, но в этом случае я работаю с одной основной конкретной таблицей Items и 5 другими «соединенными» таблицами и представлением, созданным из этих таблиц. Затем я использую представление в MS Access, с которым я более знаком, я добавил несколько новых столбцов в основную таблицу, и в одном из них я хочу сохранить вычисленное MachineRate конкретного Item на основе значений основной таблицы (та же запись ) и другие таблицы. Я смог сделать все это прекрасно на представлении.

Но мой вопрос заключается в следующем: возможно ли, чтобы это вычисленное значение использовалось в качестве значения по умолчанию для основной таблицы или запускалось там с помощью триггера?

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

Например (это только частично): основная таблица имеет следующие столбцы...

RecID, PartRef, Material, Width, Length, Thickness, MachRate etc

И MachineRate стол

RecID, Rate

И TableOfTech стол

RecID, Material, Thickness1, Thickness2, AddToMachRate  etc...

Эти 3 из 5 таблиц необходимы для моего вычисляемого значения, значение MachRate основной таблицы должно быть (Rate из MachineRate + AddToMachRate из TableOfTech), где TableOfTech.Material = MainTable.Material и MainTable.Thickness между TableOfTech.Thickness1 и Thickness2

Не уверен, насколько ex: действительно помогает, но чтобы дать вам представление о том, с чем я работаю, действительно ли это работает, чтобы вставить в столбец таблицы ТОЛЬКО НОВУЮ вставляемую запись... значение, основанное на представлении из ТОТ ЖЕ стол?

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

Я надеюсь, что это имеет смысл для вас, ребята, я с нетерпением жду любой помощи!

С. Брубахер


person S BRUBACHER    schedule 07.12.2013    source источник
comment
Вы можете создать триггер INSTEAD OF INSERT в представлении, чтобы, если произойдет INSERT в этом представлении, вы получили уведомление и могли затем решить, что делать со значениями, вставляемыми в представление — как сохранить их в базовые таблицы   -  person marc_s    schedule 08.12.2013
comment
Марк, спасибо за ответ - я поигрался с триггером «Вместо вставки», но я получаю значение по умолчанию в поле таблицы, у меня есть значение по умолчанию, установленное для столбца, поскольку оно не допускает пустых значений, просто во время тестирования, см. ниже ALTER TRIGGER [dbo].[trg_PopMachRateSQL] ON dbo.Qry_AllParts2 ВМЕСТО ВСТАВИТЬ КАК НАЧАТЬ ОБНОВЛЕНИЕ dbo.PPRR_PPRR_00000100 SET dbo.PPRR_PPRR_00000100.MachRateSQL = UseRate FROM вставлен AS i WHERE dbo.PPRR_PPRR_00Rec000100.END i   -  person S BRUBACHER    schedule 08.12.2013
comment
Мухаммед Али Не уверен, что пишу/отвечаю в нужном месте... ? Я понимаю, что вы говорите, но я хочу убедиться, что значение никогда не изменится в любом случае, если я не запущу запрос на обновление изнутри Access, поэтому, другими словами, если я когда-либо изменю данные в одной из них на 2 таблицы, в которых есть данные для вычисляемый столбец Я хочу открыть окно сообщения и спросить, нужно ли обновлять записи основного элемента в зависимости от изменения скорости моей машины или нет. Может быть, я еще не все обдумал?   -  person S BRUBACHER    schedule 08.12.2013
comment
Я не думаю, что вы можете добиться этого в Access. Всплывающее сообщение каждый раз, когда вы обновляете запись. Но вопрос в том, действительно ли вам нужна вся эта нагрузка только для того, чтобы увидеть вычисляемый столбец?? см. мой ответ ниже. Я посоветовал два очень простых решения для этого представления ИЛИ индексированных представлений, и поверьте мне, вам следует избегать срабатывания как можно больше.   -  person M.Ali    schedule 08.12.2013
comment
Мухаммед - Я слышал, что триггеры не самые лучшие, я просто пытаюсь сделать это как можно более автоматизированным, поскольку данные все равно есть, просто я работаю с базой данных в программе, которую мы используем, и я не могу просто делать что угодно с таблицами, которые я хочу, у меня уже есть вычисленное значение в представлении, которое, как я предполагаю, является тем, что вы имеете в виду во время выполнения? Я просто не могу заставить его вставить это значение в основную таблицу ПОСЛЕ ВСТАВКИ или ВМЕСТО ВСТАВКИ   -  person S BRUBACHER    schedule 08.12.2013
comment
Наконец-то я это понял. Просто нужно было правильно использовать ссылки на вставленную таблицу, посмотрите, как мне это нравится - спасибо всем за ваши предложения!   -  person S BRUBACHER    schedule 08.12.2013


Ответы (1)


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

У вас может быть вычисляемый столбец, значение которого вычисляется из столбцов из других таблиц, но вам нужно создать триггеры INSTEAD OF INSERT triggers, AFTER UPDATE, AFTER DELETE для всех таблиц, из которых вычисляется значение, чтобы синхронизировать вычисляемый столбец для любых изменений в исходной таблице, что может быть адская задача, и триггеры иногда могут быть тихими убийцами.

Поэтому, чтобы избежать всех этих хлопот, просто сохраните столбцы, из которых вычисляются значения, и сам вычисляемый столбец в одной таблице.

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

Если у вас много данных в базовых таблицах и вычисление их значений во время выполнения занимает много времени, рассмотрите INDEXED VIEWS.

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

person M.Ali    schedule 07.12.2013