#sql
#sql
Вопрос:
У меня есть таблица, в которой есть идентификатор, имя, возраст. (Имя таблицы: Employee)
Идентификатор является первичным ключом в таблице. Существует процедура Sproc, которая удаляет запись с заданным именем. Итак, в моем sproc для удаления я сначала выбираю идентификатор на основе имени. Если имя допустимо, то я выполняю удаление.
DECLARE @Id uniqueidentifier
BEGIN TRANSACTION
SELECT TOP 1 @Id=Id FROM Employee WHERE Name=@Name
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRANSACTION
RETURN ERROR_NOT_FOUND
END
DELETE FROM EMPLOYEE WHERE Id = @Id
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRANSACTION
RETURN ERROR_NOT_FOUND
END
COMMIT TRANSACTION
Мой вопрос в том, нужна ли мне транзакция в этом случае или нет. Я понимаю, что нам нужна транзакция, когда мы хотим атомарные операции (набор операций должен проходить / завершаться неудачей вместе).
Пожалуйста, прокомментируйте приведенный выше сценарий, требуется ли транзакция.. и каковы плюсы / минусы с транзакцией / без транзакции.
Комментарии:
1. Самое первое, что вам нужно изменить идентификатор получения, используя name. это небезопасно !! .
2. Хранить возраст в виде столбца в таблице тоже странно — вероятно, безопаснее и стабильнее хранить неизменяемое значение (DoB) и использовать вычисленный возраст в хранимой процедуре, или временной таблице, или представлении.
Ответ №1:
Что касается ответа на ваш вопрос — если нет сотрудника с таким именем, ни delete, ни select ничего не изменят в базе данных, таким образом, откат не требуется.
Теперь, если идентификатор уникален, а имя нет — выбор сотрудника по имени довольно опасен, поскольку у вас нет реального контроля над тем, какого сотрудника (из тех, у кого такое же имя) вы собираетесь удалить. Похоже, что эта процедура должна принимать id в качестве параметра, а не выбирать его по имени.
Ответ №2:
В вашем примере кода оба ROLLBACK
оператора фактически ничего не откатывают назад, поскольку в обоих случаях вы ничего не изменили в базе данных. Другими словами, нет, в них нет необходимости.