luglio 2007 - Posts

Column-level Security
25 luglio 07 10.43 | abenedetti | 1 comment(s)

Spesso ci si dimentica della possibilità di applicare delle sicurezze ("tu non puoi vedere") a livello di colonna.
Possiamo costruire viste e/o stored procedure ad hoc, oppure possiamo utilizzare (come sempre) l'istruzione DENY...

use ugiss
go

/* creo due utenti */
create user ceo without login
create user employee without login

/* creo lo schema */
create schema myData
go
/* creo la tabella */
create table myData.person
(
idPerson smallint primary key identity(1,1),
surname varchar(12),
name varchar(12),
creditCard char(16)
)
go

/* insert di alcuni dati di prova */
insert myData.person values
('benedetti','andrea','1234123412341234')
insert myData.person values
('mauri','davide','9876987698769876')
go

/* imposto permessi e sicurezze */
grant select on myData.person to ceo, employee
deny select on myData.person (creditCard) to employee
go

/* eseguo come CEO */
execute as user = 'ceo'
select * from myData.person

/*
Ok, questo il risultato:

idPerson surname      name         creditCard
-------- ------------ ------------ ----------------
1        benedetti    andrea       1234123412341234
2        mauri        davide       9876987698769876

(2 row(s) affected)
(2 row(s) affected)
*/

/* eseguo come EMPLOYEE */
revert
go
execute as user = 'employee'
select * from myData.person

/*
ERRORE!

Msg 230, Level 14, State 1, Line 2
The SELECT permission was denied on the column 'creditCard' of the object 'person', database 'UGISS', schema 'myData'.
*/

/*
Risolvo la select
Semplicemente chiedendo le colonne che sono abilitato a leggere
*/
select idPerson, surname, name
from myData.person

/*
Risultato:

idPerson surname      name
-------- ------------ ------------
1        benedetti    andrea
2        mauri        davide

(2 row(s) affected)
*/

Se volessimo consentire all'utente di vedere i dati NON utilizzeremo una REVOKE, ma una GRANT.
Ovvero qualcosa come:

grant select on myData.person (creditCard) to employee

N.B.: come sempre utilizzare un "select * ..." è sempre una pessima idea... ;-)

III° legge di security dei dati
24 luglio 07 12.08 | abenedetti | with no comments

Se un utente può accedere ai file di backup è inutile mettere in sicurezza il server.

Può sembrare forte e fuorviante ma, semplicemente: che senso avrebbe mettere il nostro server all'interno di un altissimo perimetro di sicurezza, se poi si potesse accedere ai nostri files di backup e, ad esempio, portarne a casa una copia?

II° legge di security dei dati
24 luglio 07 09.58 | abenedetti | 1 comment(s)

L'unico modo per verificare la bontà di un backup è farne un restore.

E' vero che il comando di RESTORE permette una verifica del contenuto, ma l'unico modo con cui si è certi (al 100% !) di un backup è di effettuarne un ripristino

I° legge di security dei dati
24 luglio 07 09.57 | abenedetti | with no comments

Prendo spunto da un mio post di ieri e da un commento di Ale per aprire una nuova mini serie...

 

Fare il backup sullo stesso disco dei dati = NON fare il backup

(Allo stesso modo, non vale dire: "faccio il backup qui tanto poi lo copio...")

Come sempre lascerò i commenti aperti ;-)

Apnea, backup e restore
23 luglio 07 05.09 | abenedetti | 4 comment(s)

Tra quelli che amano fare immersioni (di qualsiasi tipo) in mare, chi non si è mai cimentato in un pò di apnea?

In estate, tornando spesso verso le mie terre d'origine, riscopro spesso questa disciplina.

La prima regola ha, secondo me, un parallelismo impressionante con il lavoro di dba.

L'importante non è saper scendere (lo sanno fare tutti). L'importante è sempre essere in grado di saper tornare a galla.

Forse farà sorridere, ma è una regola base a cui spesso non si pensa.

Qual'è il parallelismo con i nostri dati?

Nella vita di ogni dba (ma anche di ogni sistemista, ed in generale di tutti quelli che hanno un pc con dati "sensibili") la prima regola dovrebbe essere:

L'importante non è sapere fare un backup (lo sanno fare tutti). L'importante è sempre essere in grado di saper rimettere on line i dati.

Di qui la domanda: chi ha mai testato veramente le proprie strategie di backup e restore? Chi ha mai verificato al 100% che il backup che ha in mano sia effettivamente valido, sicuro ed utilizzabile?

I commenti, come sempre, sono aperti. Apertissimi!

SQLInternalsViewer
23 luglio 07 04.59 | abenedetti | 1 comment(s)

Davide segnalava, qualche giorno fa, un gioiellino di tool.
Utilissimo per avere sott'occhio come sono fisicamente disposti i nostri dati all'interno dei db SQL Server.

Un piccolo problema (già segnalato all'autore) riguarda la presenza di database che presentano un "-" nel loro nome.
Qualcosa come: "e-db".

Nel caso l'aveste il programma non parte in quanto, eseguendo delle istruzioni come:

exec sp_executesql N'USE e-db;...

Ritorna un errore con questo messaggio:

Msg 911, Level 16, State 1, Line 1
Could not locate entry in sysdatabases for database 'e'. No entry found with that name. Make sure that the name is entered correctly.

P.S.: se possibile evitiamo questi caratteri nel nome del db... ;-)

Windows vista e telnet
16 luglio 07 11.04 | abenedetti | 2 comment(s)

Probabilmente vi starete facendo la domanda: che c'entra un post su vista e telnet su UGISS?!?!

Semplicemente per questo: come faccio a vedere se la macchina che voglio impostare come partner di un mirroring l'endpoint risponde regolarmente?
Tramite telnet, ad esempio tramite:

C:> telnet chicago 5022

Bene. E dove diavolo è telent in Windows Vista?!?!
Non c'è!

O meglio:

  • Start --> control panel --> programs and features
  • Clicco su "Turn Windows features on or off"
  • Nella lista di caratteristiche e funzionalità vado a selezionare "Telnet Client", seleziono, premo OK ed aspetto che il tutto si configuri...

Non ho ancora parole...

Mirroring: avventure con VISTA (sull'inferno...)
16 luglio 07 10.52 | abenedetti | 1 comment(s)

L'avventura è iniziata oggi alle 14.00, per terminare poco fa (sono le 22.39).

Vi racconto in breve...

  • 2 portatili in rete tra loro
  • pc "principal" con windows vista ultimate
  • pc "mirror" con windows xp sp2 (e witness all'interno di un'istanza sqlExpress, sempre sul pc win xp)
  • ognuno con il suo ip fisso
  • firewall disabilitati

in sostanza le varie impostazioni e configurazioni vanno tutte, tranne:

--Dal Principal viene creata l'associazione con il Mirror
--e viene designato il Witness
ALTER DATABASE MirrorTest
SET PARTNER = 'TCP://CHICAGO:5022';
GO

Ovvero, quando tento di dire al principal (la macchina vista) chi è il suo partner (la macchina xp) ottengo questo:

The server instance Partner rejected configure request; read its error log file for more information. The reason 1405, and state 2, can be of use for diagnostics by Microsoft. This is a transient error hence retrying the request is likely to succeed. Correct the cause if any and retry.

Rivedo le configurazioni, mi sembra tutto ok.
Pingo la macchina, tutto ok.
Provo un bel telnet, tutto ok.

Mi sento anche con Luca, via messenger.
Nessun altro coniglio dal cilindro...

Per farla breve, di chi era la colpa?!?!
Dello UAC, ovvero dello User Account Control.

Disabilitandolo e riavviando la macchina, tutto va a posto!
Senza parole...

Far vedere al cliente, via SSMS, solo il suo db
09 luglio 07 11.43 | abenedetti | 4 comment(s)

Oggi, chiaccherando con un amico, è nata la domanda: ho un cliente che si collega a SQL tramite SSMS. Posso fargli vedere, all'interno dell'object explorer, solo il suo db?

La risposta è: si. I passi sono:

  1. Creo un nuovo SQL login "myDBLogin"
  2. Creo un utente "myDBLogin" nel database master
  3. Consento (grant) CREATE DATABASE al login "myDBLogin"
  4. Accedo a SQL Server impersonificando "myDBLogin" e creo un database "myDB"
  5. Elimino (revoke) la CREATE DATABASE da "myDBLogin"
  6. Elimino (revoke) il permesso VIEW ANY DATABASE al ruolo PUBLIC
  7. Disconnetto object explorer e ri-connetto come "myDBLogin"
  8. Dalla sessione "myDBLogin" posso espandere le voci e vedere solo master, tempdb, "myDB"

Ovvero, in TSQL:

USE [master]
GO
CREATE LOGIN [myDBLogin] 
WITH PASSWORD=N'myDBLogin', 
DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO

USE [master]
GO
CREATE USER [myDBLogin] FOR LOGIN [myDBLogin]
GO

grant create database to myDBLogin
go

/* accedo come myDBLogin */
USE [master]
GO
CREATE DATABASE myDB
GO

/* accedo come sa */
revoke create database to myDBLogin
go
revoke view any database to public
go

/* disconnetto object explorer e ri-connetto come "myDBLogin" */

Come sempre i commenti sono aperti!

Filed under:
Disponibile SQL Server 2005 Best Practices Analyzer (July 2007)
06 luglio 07 06.22 | abenedetti | with no comments

Il team del SQL Server Customer Advisory ha rilasciato un aggiornamento del Best Practices Analyzer per SQL Server 2005.
Tutte le info qui.

SQL Server Best Practices
05 luglio 07 11.31 | abenedetti | with no comments

Un indirizzo da tenere a mente su technet: SQL Server Best Practices.

Guidelines, tips... best pratices!

Workshop UGISS: bloccate le agende
05 luglio 07 12.30 | abenedetti | with no comments

Come già annunciato ieri durante l'introduzione del Workshop, ecco il prossimo:

Sicuramente andremo avanti con Katmai, nome in codice della prossima release di SQL Server (2008) e poi...

... dateci feedback, commenti, post su forum e/o newsgroup ...

Bloccate le agende!

[Katmai] Operatore Merge
04 luglio 07 06.02 | abenedetti | with no comments

La novità sicuramente più interessante, mostrata oggi durante il workshop UGISS, è relativa all'operatore MERGE.

Ovvero alla possibilità di eseguire, simultaneamente, differenti istruzioni DML.

Uno degli utilizzi tipici riguarda tutti quei casi in cui si rendono necessarie delle operazioni di upsert (insert di record se non esistono, update se esistono). Operazioni che oggi dobbiamo necessariamente fare a mano, proprio con una somma di insert e update.

Vi lascio subito l'esempio mostrato:

--------------------------------------------------------
-- Inizio Script
--------------------------------------------------------
USE master
GO

-- Cancellazione db, se esiste
IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'UGISS')
DROP DATABASE UGISS
GO

CREATE DATABASE UGISS
GO

USE UGISS
GO

-- creo tabella prodotti (è la mia tabella di produzione)
CREATE TABLE Prodotti
(
codice char(4) primary key,
descrizione varchar(35),
qta decimal(10,2)
)
go

-- creo la tabella di appoggio (è la mia tabella di staging)
CREATE TABLE tmpProdotti
(
codice char(4) primary key,
descrizione varchar(35),
qta decimal(10,2)
)
go

-- inserimento valori su tabella di produzione
insert Prodotti values ('AZTN','111111',12.10)
insert Prodotti values ('MSFT','222222',22.00)
insert Prodotti values ('ABCD','333333',4.56)
insert Prodotti values ('XXXX','999999',8)

-- inserimento valori su tabella di staging
insert tmpProdotti values ('AZTN','111111',8.10)
insert tmpProdotti values ('MSFT','222222',24.20)
insert tmpProdotti values ('ABCD','333333',4.56)
insert tmpProdotti values ('DEFG','444444',8.16)
insert tmpProdotti values ('XXXX','999999',-8)

-- Vedo le tabelle di partenza
select * from Prodotti
select * from tmpProdotti

-- Sincronizzazione delle tabelle
MERGE Prodotti S -- tabella target
        USING tmpProdotti T -- tabella source
        ON S.codice = T.codice
        WHEN MATCHED AND (S.qta + T.qta = 0) THEN
                DELETE
        WHEN MATCHED THEN
                UPDATE SET
                    S.qta = T.qta,
                    S.descrizione = T.descrizione
        WHEN NOT MATCHED THEN
                INSERT VALUES (codice, descrizione, qta)
        -- output: vedo i dettagli di INSERT/UPDATE/DELETE
        -- eseguiti sulla tabella target
        OUTPUT $action, inserted.codice, inserted.qta [ins qta], deleted.qta [del qta];

-- Vedo le tabelle sincronizzate
select * from Prodotti
select * from tmpProdotti

--------------------------------------------------------
-- Fine Script
--------------------------------------------------------

[Katmai] Table Valued Parameter
04 luglio 07 05.49 | abenedetti | with no comments

Altra novità: la possibilità di passare, come parametro di una User Function o di una Stored Procedure, un User Defined Type di tipo tabella.

Scenari d'uso: tutti quei casi in cui abbiamo la necessità di passare resultset alle nostre routine, evitando la costruzione di tabelle temporanee o la creazione di diversi parametri in ingresso (o altri metodi come ricevere, come parametro, del XML e lavorarlo...)

Questo l'esempio completo che ho mostrato durante la sessione:

--------------------------------------------------------
-- Inizio Script
--------------------------------------------------------
USE master
GO

-- Drop del db se esiste
IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'UGISS')
DROP DATABASE UGISS
GO

-- Creo db di test
CREATE DATABASE UGISS
GO

-- Utilizzo db di test
USE UGISS
GO

-- Tabella di esempio
CREATE TABLE Prodotti
(
idRecord smallint primary key identity(1,1),
descrizione varchar(35),
importo decimal(10,2),
dataAggiornamento datetime,
qta smallint
)
go

/* creo un tipo tabella - USER DEFINED TABLE */
create type productType as table
(
descrizione varchar(35),
importo decimal(10,2)
)
go

/* procedura che riceve i dati da parametro tabella */
create procedure dbo.up_insertProdotti
(
@productT productType READONLY
)
as
set nocount on

    insert Prodotti (descrizione, importo, dataAggiornamento, qta)
    select descrizione, importo, getdate(), 0 from @productT

set nocount off
go

/*
TEST

1. dichiaro una variabile del mio tipo tabella
2. valorizzo la variabile
3. la passo alla procedura creata poco sopra
*/
declare @productT as productType
insert @productT
select 'aaaa',1 union
select 'bbbb',2 union
select 'cccc',3 union
select 'dddd',4

/* test procedura */
exec dbo.up_insertProdotti @productT

/* vedo la tabella */
select * from prodotti
--------------------------------------------------------
-- Fine Script
--------------------------------------------------------

[Katmai] Inserimento multiplo di righe
04 luglio 07 05.36 | abenedetti | with no comments

Come detto qui, oggi, durante il Workshop UGISS (che è ancora in corso), abbiamo inziato a far vedere la prossima release di SQL Server. 

In principal modo mi sono occupato di mostrare alcune nuove caratteristiche legate al T-SQL.

Una di queste: effettuare insert multipli con una singola istruzione.

Ovvero, tramite l'istruzione INSERT:

...

INSERT Prodotti (descrizione, importo, dataAggiornamento)
VALUES    (N'Prodotto 111',111,getdate()),
        (N'Prodotto 222',222,getdate()),
        (N'Prodotto 333',333,getdate())
GO

More Posts Next page »

This Blog

Syndication