Publikoval Michal Kočí dňa 12.8.2006 o 16:21 v kategórii SQL
Stalo sa Vám niekedy, že ste potrebovali niekomu sprístupniť tabuľku, kde môže meniť zopár údajov a nechcelo sa Vám programovať kvôli tomu novú aplikáciu? Alebo ste niekedy rozmýšlali nad tým, ži cez nejaké známe rozhranie (SharePoint, Reporting Services, ...) ide povoliť modifikácia údajov uložených v DB? A viete, že sa dá spraviť zostava do Reporting Services, ktorá bude vedieť jednoducho modifikovať dáta v DB?
Občas máme požiadavku na povolenie modifikácie istej malej množiny údajov v databáze. V závislosti od rozsahu menených údajov a samozrejme od miesta ich uloženia (DB, súbory, SharePoint, ...) následne prijímame rozhodnutie, ako užívateľom modifikáciu povoliť. Obvykle ide o širšiu množinu údajov (viac stĺpcov jednej tabuľky, či dokonca viac tabuliek) a vtedy je pre užívateľa príjemné mať komfortné užívateľské rozhranie. Naposledy však vyvstala požiadavka modifikovať práve jeden stĺpec tabuľky, pričom na identifikáciu záznamu ktorý sa ide meniť slúžil ďaľší stĺpec tej istej tabuľky. Konkrétne podľa mena užívateľa bolo potrebné do tabuľky zaznačiť jeho login, ktorý sa hlási do externého systému. No a toto je presne prípad, kedy programovanie aplikácie podľa môjho názoru nemá zmysel. Lenže, aké prostredie použiť (zneužiť) tak, aby sa táto požiadavka dala splniť?
Šťastie nám prialo, pretože presne v tom období, kedy sme mali priniesť nejaké riešenie publikoval Jonathan Spink na serveri SQL Server Central článok A Report to Display and Edit User 'Rights', ktorý zjednodušene popisuje, ako spraviť zostavu, ktorá okrem zobrazenia dát umožní aj ich modifikáciu. Celý fígeľ spčíva v tom, že ako zdroj zostavy nie je SELECT príkaz, ale uložená procedúra. Tá vždy vráti dátovú množinu, ak jej však sú zaslané aj isté parametre, potom pred vrátením dátovej množiny dôjde k ich editácii.
V našom prípade report funguje nasledovne:
Uložená procedúra u nás vyzerá nasledovne. Ak dostane parameter @OperatorId rovný -1 (čo je hodnota voľby <Iba zobrazenie>), potom modifikáciu záznamu nevykoná, inak nastaví login na hodnotu parametra @UserLogin (ak je ako hodnota poslaný prázdny reťazec, bude táto nastavená na NULL).
create procedure rep_loginy
(
@OperatorId int,
@UserLogin varchar(8)
)
as
begin
if @OperatorId <> -1
begin
if @UserLogin = '' set @UserLogin = NULL
update
operators
set
user_login = @UserLogin
where
operator_id = @OperatorId
end
select
op.user_name,
op.user_login
from
operators op
order by
op.user_name
end
Ako vždy pri navrhovaní riešenia, aj pri tomto je potrebné dôkladne zvážiť pre a proti. Pre hovorí najmä jednoduchá implementácia a možnosť použiť štandardné programovvé vybavenie. Proti hovorí najmä možné zmiatnutie užívateľov tým, že cez reportovací systém menia údaje. Komu sa však zdajú plusy prevyšujúce mínusy, tomu iste tento spôsob riešenia príde vhod. Nám vhod rozhodne prišiel.
Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.