Какова лучшая практика для работы в неуправляемой модели программирования - PullRequest
0 голосов
/ 04 августа 2010

У меня есть запрос

UPDATE dbo.M_Room
 SET

 //do something
WHERE PK_RoomId= @RoomId AND IsActive=1 AND FK_DepartmentId =@DepartmentId

Теперь предположим, что PK_RoomId - мой Pk M_Room и является автоинкрементным полем. В соответствии с этим я мог бы использовать

WHERE PK_RoomId= @RoomId

вместо

WHERE PK_RoomId= @RoomId AND IsActive=1 AND FK_DepartmentId =@DepartmentId

Какие все угрозы я мог бы преодолеть, если бы использовал второе условие, а не первое. Если у нас нет никаких отношений / ограничений (PK, FK и т. Д.) Физически существует и не может быть реализовано из-за неуправляемой структуры базы данных.

Какая будет ваша рекомендация в таком сценарии. Что нужно сделать, чтобы данные были согласованными.

Ответы [ 2 ]

0 голосов
/ 04 августа 2010

Если вы используете транзакции READ-UNCOMMITTED или вообще не проводите транзакции, или если данные долгое время сидели на чьем-то экране, дополнительные условия могут спасти вас от скрытого обновления, предполагая, что ваш // что-то сделаетчто-то делает с колонкой IsActive.

Это также может быть последней защитой от того, чтобы просто ошибиться (посмотреть, не активна ли комната, а затем забыть использовать этот факт).

Обязательно проверьте количество строк, обновляемых в любом случае.

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

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

0 голосов
/ 04 августа 2010

Не думаю, что стоит поменять WHERE на WHERE PK_RoomId= @RoomId.Первая часть (часть, которую вы хотите сохранить) предназначена для идентификации записи.Вторая часть (AND IsActive=1) используется для ограничения обновления в зависимости от того, активна комната или нет.Что касается последней части (AND FK_DepartmentId =@DepartmentId), это может означать, что иногда вы хотите обновить комнату, только если она принадлежит указанному вами отделу.Это также может быть полезно.

Почему именно вы хотите изменить запрос?

...