Proteggere alcune righe di una tabella

giovedì 07 luglio 2011 - 14.04
Tag Elenco Tags  SQL Server 2005

ignaxio Profilo | Newbie

Ciao,

mi chiedevo: è possibile in SQL S. 2005 proteggere alcune righe di una tabella in modo che non possano essere cancellate e/o aggiornate?
ad esempio in una ipotetica tabella di codici, voglio che le righe con codice < 10 non possano essere ne cancellati, ne aggiornati.

Pensavo ad un trigger, ma non mi viene niente in mente che non sia altamente 'sporco' - tipo cancellare e ricreare i codici intoccabili ad ogni operazione di UPD e DEL -, anche se essendo una tabella che non sarà aggiornata di frequente potrebbe anche starci.

ci sono soluzioni più pulite?

renarig Profilo | Expert

Booo!!!

Mi vengono in mente piu idee.

1) a lato applicazione ( non so cosa sia ) forse puoi fare in modo che le modifiche
ed eliminazioni siano consentite su controllo di un particolare campo
( con Access è sicuramente possibile )

2) Se non vuoi impegnare la applicazione potresti fare una nuova tabella ( non accessibile
agli utenti ) nell' SQL e qui scrivere i valori che devono permanere

Poi hai la possibilita di confrontare le 2 tabelle con una query e rilevare difformita
( non impedisci le modifiche ma le rilevi solamente per poi porvi rimedio )

3) Fai 2 tabelle uguali nella strutture ma in una metti i record non modificabili
nell'altra metti i record modificabili.

Poi fai una query di unione fra le 2 per generare la tabella complessiva


Sicuramente non ho centrato il problema,
sono solo 3 idee

ma_di Profilo | Junior Member

>Ciao,
>
>mi chiedevo: è possibile in SQL S. 2005 proteggere alcune righe
>di una tabella in modo che non possano essere cancellate e/o
>aggiornate?
>ad esempio in una ipotetica tabella di codici, voglio che le
>righe con codice < 10 non possano essere ne cancellati, ne
>aggiornati.
>
>Pensavo ad un trigger, ma non mi viene niente in mente che non
>sia altamente 'sporco' - tipo cancellare e ricreare i codici
>intoccabili ad ogni operazione di UPD e DEL -, anche se essendo
>una tabella che non sarà aggiornata di frequente potrebbe anche
>starci.
>
>ci sono soluzioni più pulite?

Ciao,
gestirei le operazioni di cancellazione da stored procedure, lasciando libera l'applicazione di passare ciò che vuole.
Nella stored, se il codice non deve essere cancellato (eseguendo i dovuti controlli ), gestire l'uscita con un codice di errore, in modo che l'applicativo possa informare l'utente dell'operazione non possibile; se invece il codice può essere cancellato, eseguire l'operazione e ritornare un altro codice di uscita.

alx_81 Profilo | Guru

>Ciao,
Ciao

>mi chiedevo: è possibile in SQL S. 2005 proteggere alcune righe
>di una tabella in modo che non possano essere cancellate e/o
>aggiornate?
A mio avviso devi scegliere tu cosa seguire come "filosofia". Se sei uno di quelli per cui il database deve difendersi da solo indipendentemente dalle app che lo consumano, mi viene da dire un bel trigger before delete.
Se invece è l'applicazione che non deve far effettuare quelle cancellazioni oppure se vuoi che il db non abbia logiche di preservazione internamente, una bella stored procedure con tanto di accesso negato alla tabella, in modo che quella sp sia l'unica che può fare quel ragionamento.
Vi è anche da dire che puoi anche ragionare in soft delete, e quindi non cancellare mai il record, ma questo è più da "logica di business".
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

ignaxio Profilo | Newbie

Ciao!

La protezione deve essere lato SQL, qundi la tabella deve difendersi da sola, anche perchè essendo accessibile al momento da più applicazioni non vorrei mettere le mani ovunque.

Il trigger before delete è quello che veniva in mente anche a me, ma è possibile fare un trigger condizionato alle righe che voglio?
per es

CREATE TRIGGER [dbo].[Trig_DEL_TEST] ON [dbo].[mytable] INSTEAD OF DELETE [b]WHERE codice < 0[/b] AS BEGIN RAISERROR ('blablabla', 1, 1); END

alx_81 Profilo | Guru

>Il trigger before delete è quello che veniva in mente anche a
>me, ma è possibile fare un trigger condizionato alle righe che
>voglio?
basta fare l'if tra il BEGIN/END. Non sull'instead of.

BEGIN IF codice IN (1,2,3,4,5, ...) BEGIN -- fai quello che serve END END
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

ignaxio Profilo | Newbie

ho appena sperimentato! non sapevo che quando esegui il trigger si creano due tabelle
deleted e inserted dove ci vanno a finire le righe in elaborazione!

adesso la strada è spianata! thanks! ;)

alx_81 Profilo | Guru

>ho appena sperimentato! non sapevo che quando esegui il trigger
>si creano due tabelle
>deleted e inserted dove ci vanno a finire le righe in elaborazione!
ottimo, in effetti l'avevo dato un po' perscontato..

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5