Как реализовать каскадное добавление?
Добрый вечер, подскажите, пожалуйста, как правильно реализовать каскадное добавление? Вот у меня есть три таблицы Работник, Задача, Реализация задачи.
На сайте есть форма добавления новой задачи. В момент отправки вызывается следующая процедура:
ALTER procedure [dbo].[addTask] @definition varchar(1000), @userEmail varchar(30) as begin if (@userEmail is not null) BEGIN INSERT INTO Задача(Описание) VALUES(@definition) END UPDATE Реализация_задачи SET ID_работника = (SELECT ID_работника FROM Работник WHERE Электронная_почта = @userEmail) WHERE ID_работника = 1 end |
ALTER procedure [dbo].[addTask] @definition varchar(1000), @userEmail varchar(30) as begin if (@userEmail is not null) BEGIN INSERT INTO Задача(Описание) VALUES(@definition) END UPDATE Реализация_задачи SET ID_работника = (SELECT ID_работника FROM Работник WHERE Электронная_почта = @userEmail) WHERE ID_работника = 1 end
После того, как произошла вставка данных в таблицу Задача, срабатывает триггер:
ALTER TRIGGER [dbo].[realizeTask] ON [dbo].[Задача] AFTER insert AS insert into Реализация_задачи(ID_работника,Номер_задачи,) values(1,(SELECT Номер_идеи FROM inserted)) |
ALTER TRIGGER [dbo].[realizeTask] ON [dbo].[Задача] AFTER insert AS insert into Реализация_задачи(ID_работника,Номер_задачи,) values(1,(SELECT Номер_идеи FROM inserted))
Так как в триггер нельзя передать никакой параметр, то в качестве ID_работника просто прописываем 1. После того, как триггер отработал, возвращаемся в процедуру и обновляет таблицу Реализация_задачи, где заменяем ID_работника уже на реальное значение.
Подскажите, пожалуйста, наверное, такой подход является не верным? Сейчас я заполняю каким-то дефолтным значением ID_работника, но это впоследствии может привести к ряду ошибок. Но как иначе заполнить таблицу Реализация задачи я не знаю. Подскажите, пожалуйста?
Буду благодарна за Вашу помощь)
Дополнительно:
Вот на зачем триггер-то? вставка выполняется процедурой - вот в ней и реализуйте ВСЮ необходимую логику, а не один несчастный огрызок, который потом ещё что-то должен инициировать через триггер...
Но вообще решение просто жесть, никогда так не делайте.
https://learn.microsoft.com/ru-ru/sql/t-sql/functi...
Работает начиная с 2014 версии, в других СУБД будет иначе.
CREATE PROCEDURE [dbo].[addTask] @definition varchar(1000), @userEmail varchar(30) AS BEGIN IF (@userEmail is not null) BEGIN INSERT INTO Задача(Описание) VALUES (@definition) INSERT INTO Реализация_задачи (ID_работника, ID_задачи) SELECT ID_работника, SCOPE_IDENTITY() FROM Работник WHERE Электронная_почта = @userEmail END END GO EXEC addTask @definition = 'New task', @userEmail = 'Employee@mail.com' GO |
CREATE PROCEDURE [dbo].[addTask] @definition varchar(1000), @userEmail varchar(30) AS BEGIN IF (@userEmail is not null) BEGIN INSERT INTO Задача(Описание) VALUES (@definition) INSERT INTO Реализация_задачи (ID_работника, ID_задачи) SELECT ID_работника, SCOPE_IDENTITY() FROM Работник WHERE Электронная_почта = @userEmail END END GO EXEC addTask @definition = 'New task', @userEmail = 'Employee@mail.com' GO
https://sqlize.online/sql/mssql2017/72762ba5b14369...
- подскажите, пожалуйста, а что значит SELECT SCOPE_IDENTITY()
- Olya_Ann, https://learn.microsoft.com/en-us/sql/t-sql/functi...
- спасибо))
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для реализации каскадного добавления веб-элементов на страницу, вы можете использовать JavaScript и принцип делегирования событий. Каскадное добавление позволяет добавлять новые элементы на страницу, которые будут иметь те же обработчики событий, что и исходные элементы.
Вот пример реализации каскадного добавления веб-элементов с помощью JavaScript:
```html
.item {
padding: 10px;
margin: 5px;
border: 1px solid #ccc;
cursor: pointer;
}
document.getElementById('container').addEventListener('click', function(event) {
if (event.target.classList.contains('item')) {
var newItem = document.createElement('div');
newItem.className = 'item';
newItem.textContent = 'New Item';
this.appendChild(newItem);
}
});
```
В этом примере мы создаем контейнер `div` с идентификатором `container` и двумя дочерними элементами `div` с классом `item`. Затем мы добавляем обработчик события `click` к контейнеру, который проверяет, был ли кликнут элемент с классом `item`. Если да, то создается новый элемент `div` с классом `item` и текстом "New Item", который добавляется в конец контейнера.
Таким образом, при клике на любой элемент с классом `item`, будет добавлен новый элемент с тем же классом и текстом "New Item", обеспечивая каскадный эффект добавления элементов на страницу.