Как реализовать каскадное добавление?

Ссылка скопирована
14 апреля 2026 1 ответ

Добрый вечер, подскажите, пожалуйста, как правильно реализовать каскадное добавление? Вот у меня есть три таблицы Работник, Задача, Реализация задачи.

Как реализовать каскадное добавление?

На сайте есть форма добавления новой задачи. В момент отправки вызывается следующая процедура:

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_работника, но это впоследствии может привести к ряду ошибок. Но как иначе заполнить таблицу Реализация задачи я не знаю. Подскажите, пожалуйста?

Буду благодарна за Вашу помощь)

Дополнительно:

Вот на зачем триггер-то? вставка выполняется процедурой - вот в ней и реализуйте ВСЮ необходимую логику, а не один несчастный огрызок, который потом ещё что-то должен инициировать через триггер...

  • Ну вы и наворотили. Я так понимаю вы таким образом пытаетесь объехать, то что вам номер задачи неизвестен? Какая у вас СУБД?
    Но вообще решение просто жесть, никогда так не делайте.
  • nApoBo3, да, знаю, что это очень грубая ошибка(( просто не знаю, как тогда быть с номером задачи, он ведь не известен
  • Olya_Ann, субд какая?
  • nApoBo3, MS SQL Server
  • Olya_Ann, версия?
  • nApoBo3, 2018 года
  • Olya_Ann, бесплатная версия
  • Olya_Ann,
    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...
    • спасибо))
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Алексей Денисов Ответ

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

    Вот пример реализации каскадного добавления веб-элементов с помощью JavaScript:

    ```html

    Cascading Elements

    .item {
    padding: 10px;
    margin: 5px;
    border: 1px solid #ccc;
    cursor: pointer;
    }

    Item 1
    Item 2

    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", обеспечивая каскадный эффект добавления элементов на страницу.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно