#asp.net #sql-server #stored-procedures
#asp.net #sql-сервер #хранимые процедуры
Вопрос:
Я создал простой asp.net форма, которая позволяет пользователям просматривать список дат обучения и регистрироваться на эту дату, они вводят свое имя и employeeid вручную (я не хочу разрешать дублирующие идентификаторы сотрудников), каждая дата соответствует обучению (уникальный идентификатор в таблице), это вставляется в таблицу со следующей структурой:
tbl_emptraining
trainig_id ( which is unique)
trainingDate
employeename ( which is unique)
employeeID (entered ) needs to be unique on each trainig_id and unique for all different training ids..
Как бы я мог предотвратить регистрацию сотрудника для получения дубликатов идентификаторов trainig в базе данных Sql. Я хочу запустить событие, при котором пользователю может быть успешно отображено сообщение о том, что сотрудник зарегистрирован для обучения ..???
Ответ №1:
Два способа сделать это навскидку…
Добавьте уникальный (он может быть некластеризованным) индекс в комбинации двух столбцов (это также ускоряет поиск по trainID / EmpID)
Используйте ограничение уникальности (http://www.w3schools.com/sql/sql_unique.asp )
ALTER TABLE [TableName]
ADD CONSTRAINT uc_PersonTrainID UNIQUE (training_id, employee_id)
Вы также упомянули, что имя сотрудника уникально… возможно, вы захотите переосмыслить это … есть несколько очень распространенных имен.
.
.
Пожалуйста, оцените, если это полезно.
Ответ №2:
Во-первых, вы должны убедиться, что база данных имеет правильные ограничения. В этом случае уникальный индекс в поле EmployeeID и уникальное ограничение на EmployeeName, вероятно, были бы правильными.
Затем в вашей бизнес-логике (.net-код, но для этого полезно иметь определенный уровень) вы должны выполнить проверку базы данных, чтобы увидеть, существует ли уже EmployeeName. Затем верните сообщение, если имя уже существует.
Наконец, вы могли бы использовать некоторый javascript для выполнения вызова базы данных в реальном времени таким же образом, как указано выше, но это было бы необязательно.
Кроме того, глядя на то, что вы написали, кажется, что ваша схема базы данных могла бы быть лучше с соотношением «многие к одному» между обучением и сотрудниками.
Ответ №3:
В зависимости от того, какую версию SQL Server вы используете, вы могли бы использовать инструкцию merge, которая вставит запись, если определенные критерии не выполнены (обычно называемую инструкцией upsert). Если вы не можете использовать инструкцию merge, вы можете просто написать свою собственную хранимую процедуру upsert.
Ответ №4:
Как пользователь выбирает идентификатор обучения? Если существует какой-либо выпадающий список, то выберите только те записи об обучении, для которых они подходят (в базе данных еще нет записи об обучении для этого типа обучения и этого пользователя). Тогда они никогда не будут выбирать то, что нельзя сохранить.
Комментарии:
1. Извините. Моя проблема не в выпадающем списке с идентификаторами тренировок, в котором выбирается только тренировка с доступными видами спорта,,,, а в идентификаторах сотрудников, они вводят свою информацию для более чем одной тренировки, в этой таблице указано только одно название тренировки..
Ответ №5:
Если я правильно понял ваш вопрос, вы можете установить первичный ключ с несколькими столбцами. Используйте training_id и EmployeeID. Это позволит вводить идентификатор сотрудника «12345» только один раз для каждого training_id.
Комментарии:
1. Я думаю, вам следует сделать это, а также то, что предложил @thursdaysgeek.