Збережена процедура update

Збережена процедура Update використовує основний метод ідентифікації рядки і приймає в якості параметрів код товару і нові дані На основі цих даних вона виконує інструкцію DML UPDATE

Додаткова Операції поновлення схильні втрат даних, і цю тему ми торкнемося в інформація чолі 51 Дану проблему можна обійти, встановлюючи штампи або виконуючи мінімальні оновлення Кожна з цих методик буде продемонстрована в цьому розділі з супутнім прикладом збереженої процедури

У першому прикладі збережена процедура обходить проблему втрачених оновлень за допомогою перевірки стовпця rowversion з типом timestamp При кожному оновленні рядка значення цього поля автоматично оновлюється Якщо значення rowversion відрізняється від витягнутого, значить, рядок оновлюється інший транзакцією При цьому умова rowversion в реченні WHERE не задовольняється, що запобігає оновлення

Оновлення З умовою Rowversion

Ця версія процедури Update оновлює всі стовпці рядка Їй повинні передаватися всі параметри, навіть якщо деякий стовпець не оновлюється Ця процедура передбачає, що стовпець rowversion був відібраний при первісному отриманні даних

Якщо значення стовпця rowversion відрізняється від витягнутого в момент відбору даних, то оновлення не виконується Ця процедура визначає, що використовується глобальна змінна @ @ rowcount, і передає помилку зухвалому обєкту

Як приклад можна привести текст збереженої процедури pProduct_Update_ RowVersion з бази даних OBXKites:

CREATE PROCEDURE pProduct_Update_RowVersion (

@Code CHAR(15),

©RowVersion Rowversion,

@Name VARCHAR(50),

©ProductDescription VARCHAR(50),

@ActiveDate DateTime,

@DiscontinueDate DateTime )

AS

SET NoCount ON UPDATE dboProduct SET

ProductName = @Name,

ProductDescription = ©ProductDescription,

ActiveDate = ©ActiveDate,

DiscontinueDate = @DiscontinueDate WHERE Code = @Code

AND [RowVersion] = @RowVersion IF @@ROWCOUNT = 0 BEGIN

IF EXISTS ( SELECT * FROM Product WHERE Code = @Code)

BEGIN

RAISERROR (Товар не було оновлено з огляду на те, що інша транзакція оновила рядок з моменту останнього читання’, 16,1)

RETURN -100

END

ELSE

BEGIN

RAISERROR (Товар не було оновлено,

так як рядок була видалена , 16,1)

RETURN -100 END

END

RETURN

Для тестування процедури оновлення винесемо штамп для товару з кодом 1001 за допомогою процедури pProduct_Fetch:

Ехес pProduct_Fetch 10 Січня

Отримаємо наступний результат (стовпці усічені):

Code                       Name RowVersion

1001 Basic Box Kite 21 inch 0x0000000000000077

Тепер викличемо процедуру pProduct_Update_Rowversion з отриманим значенням rowversion і спробуємо виконати оновлення:

Ехес pProduct_Update_Rowversion 1001,

0x0000000000000077,

‘updatetest,

‘new description,

‘1/1/2002,

NULL

Процедура оновить всі стовпці рядка, при цьому стовпцю rowversion буде присвоєно нове значення

Мінімальна оновлення

Друга версія збереженої процедури Update демонструє метод мінімальних оновлень Оновлюючи тільки ті стовпці, які вимагають зміни значень, ми суттєво скорочуємо ймовірність заміни оновлень, виконуваних іншим користувачем Цей варіант процедури можна порівняти з хірургічною операцією, коли лікар вторгається тільки в потрібну йому область, не завдаючи побічних пошкоджень

Дана процедура, що зберігається не використовує динамічний SQL для створення інструкції UPDATE, хоча і це було б зробити неважко Слід зазначити, що динамічний SQL виконується з профілем безпеки користувача, а не збереженої процедури, що призводить до необхідності перекомпіляції процедури і відповідного зниження продуктивності Саме цей аспект робить небажаним використання динамічного SQL в збережених процедурах виробничих додатків

Процедура мінімального поновлення виконує інструкцію UPDATE окремо для кожного переданого їй параметра:

CREATE PROCEDURE pProduct_Update_Minimal (

@Code CHAR(15),

@Name VARCHAR(50) = NULL,

@ProductDescription VARCHAR(50) = NULL,

@ActiveDate DateTime = NULL,

@DiscontinueDate DateTime = NULL )

AS

SET NoCount ON

IF EXISTS (SELECT * FROM dboProduct WHERE Code = @Code)

BEGIN

BEGIN TRANSACTION IF @Name IS NOT NULL BEGIN

UPDATE dboProduct SET

ProductName = @Name WHERE Code = @Code IF @@Error &lt&gt 0 BEGIN

ROLLBACK RETURN -10 0 END

END

IF ©ProductDescription IS NOT NULL BEGIN

UPDATE dboProduct SET

ProductDescription = @ProductDescription WHERE Code = @Code IF @@Error &lt&gt 0 BEGIN

ROLLBACK RETURN -100 END

END

IF @ActiveDate IS NOT NULL BEGIN

UPDATE dboProduct SET

ActiveDate = @ActiveDate WHERE Code = @Code IF @@Error &lt&gt 0 BEGIN

ROLLBACK RETURN -10 0 END

END

IF @DiscontinueDate IS NOT NULL BEGIN

UPDATE dboProduct SET

DiscontinueDate = @DiscontinueDate

WHERE Code = @Code IF @@Error &lt&gt 0 BEGIN

ROLLBACK RETURN -100 END

END

COMMIT TRANSACTION END ELSE BEGIN

RAISERROR

(Товар не було оновлено, так як рядок була видалена1, 16,1)

RETURN -10 0 END RETURN

При виклику процедури, що зберігається мінімального оновлення потрібно передавати тільки ті стовпці, які вимагають зміни значення У першу чергу процедура визначає, чи існує така рядок, після чого передані параметри оновлюють стовпчики таблиці У наступному прикладі ми спробуємо оновити опис товару з кодом 10 січня:

EXEC pProduct_Update_Minimal @Code = 11001 ,

@ProductDescription = a minimal update

Протестуємо результати за допомогою збереженої процедури pProduct_Fetch:

EXEC pProduct_Fetch 10 01

Буде отримано наступний результат (стовпці усічені):

Code                             Name            ProductDescription

1001                             updatetest      a minimal update

Збережена процедура Delete

Збережена процедура видалення виконує інструкцію DML UPDATE Вона може виявитися найбільш складною з усіх, в залежності від рівня архівування даних і використання логічних вилучень У прикладі, взятому з облікової бази даних OBXKites, змінна (© ProductCode перетвориться в (© ProductID, потім перевіряється наявність даного товару, після чого він видаляється з таблиці

CREATE PROCEDURE pProduct_Delete(

(©ProductCode INT )

AS

SET NOCOUNT ON

DECLARE (©ProductID Uniqueldentif ier SELECT (©ProductID = ProductID FROM Product

WHERE Code = (©ProductCode If @@RowCount = 0 BEGIN

RAISERROR

(Неможливо видалити товар з кодом% i

– він не існує , 16,1, (© ProductCode)

RETURN

END

ELSE

DELETE dboProduct

WHERE ProductID = @ProductID RETURN

Для тестування збереженої процедури pProduct_Delete ми спробуємо видалити неіснуючий товар з кодом 99 і в результаті отримаємо повідомлення про помилку:

Ехес pProduct_Delete 99

Неможливо видалити товар з кодом 99 – він не існує

Додаткова Незважаючи на те що наведена як приклад процедура видалення інформація виключно проста, на практиці видалення даних є однією з найскладніших завдань рівня абстракції даних Все залежить від того, що потрібно робити зі старими даними Стратегії логічного видалення та архівування даних ми обговорювали в главі 24

Резюме

Рівень абстракції даних є ключовим компонентом плану архітектури бази даних Він грає головну роль у можливості подальшого розширення і витратах на супровід бази даних Навіть якщо на перший погляд здається, що витрати на створення рівня абстракції даних і перетворення програмного коду існуючих додатків досить великі (якщо існуюча база поки використовує пряме звернення до таблиць), досвідчені програмісти і менеджери зрозуміють, що всі вкладені кошти і праця з лишком окупляться в процесі подальшої експлуатації бази даних

У наступному розділі ми продовжимо розмову про розробку бази даних, звернувши свою увагу на портативний світ SQL Server Mobile

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*