|
Di seguito gli interventi pubblicati in questa sezione, in ordine cronologico.
A tutti quelli che lavorano su database è capitato, almeno una volta nella vita, di dover cercare un certo valore (stringa o altro) presente in un qualche punto del db. Nel mio caso specifico, una web application pubblicata sul web è stata attaccata con SQL-injection e ci siamo ritrovati con migliaia (20.000-30.000) di righe del db (repository di un CM) sporcate con javascript malevolo. La prima, istantanea soluzione è stata quella di mettere offline l'applicazione; per ripulirla, invece, dal malware, ho usato una stored procedure pubblicata a questo indirizzo http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm da Narayana Vyas Kondreddi al quale va la mia riconoscenza...  . In sostanza, creata la SP, è possibile indicare il valore da ricercare all'interno del db e... attendere. Sempre dello stesso autore, anche una SP per trovare e sostituire valori http://vyaskn.tripod.com/sql_server_search_and_replace.htm.Per vostra comodità riporto il codice per la creazione della stored procedure. CREATE PROC SearchAllTables( @SearchStr nvarchar(100))ASBEGIN -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved. -- Purpose: To search all columns of all tables for a given search string -- Written by: Narayana Vyas Kondreddi -- Site: http://vyaskn.tripod.com -- Tested on: SQL Server 7.0 and SQL Server 2000 (anche SQL Server 2005 da me) -- Date modified: 28th July 2002 22:50 GMT CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) SET NOCOUNT ON DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) SET @TableName = '' SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') WHILE @TableName IS NOT NULL BEGIN SET @ColumnName = '' SET @TableName = ( SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName AND OBJECTPROPERTY( OBJECT_ID( QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) ), 'IsMSShipped' ) = 0 ) WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) BEGIN SET @ColumnName = ( SELECT MIN(QUOTENAME(COLUMN_NAME)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2) AND TABLE_NAME = PARSENAME(@TableName, 1) AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') AND QUOTENAME(COLUMN_NAME) > @ColumnName ) IF @ColumnName IS NOT NULL BEGIN INSERT INTO #Results EXEC ( 'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' + ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 ) END END END SELECT ColumnName, ColumnValue FROM #ResultsEND
Chiudo con un ringraziamento: Dear Narayana many thanks!
Un collega mi ha chiesto come sia possibile aggiornare alcuni campi di tabelle collegate con JOIN; nel caso specifico si vorrebbe denormalizzare due tabelle consolidandole in una entità.
La risposta è SI, si può fare, anche facilmente:
UPDATE Tabella1 SET Tabella1.CampoNuovo = Tabella2.CampoVecchio FROM Tabella1 INNER JOIN Tabella2 ON Tabella1.ID = Tabella2.ID
Siamo in ambiente Microsoft SQL Server 2005 aggiornato col ServicePack 2.
Terminato il porting dei database precedentemente residenti su un ambiente SQL2000 proviamo a fare il backup e....
Cannot open backup device. Operating system error 5 (error not found). Microsoft.SqlServer.Smo
Il problema è dovuto alla mancanza dei privilegi necessari per l'utente SQLService per la scrittura sulla risorsa specificata per la destinazione del file di backup.
Nel mio esempio, l'utente di servizio SQLService non ha privilegi per creare il file backup.bak nel disco P:

Tutte le altre impostazioni sono state lasciate invariate anche se poi, una volta risolto il problema, andrò a impostare "Overwrite all existing backup sets" e "Verify backup when finished"...

Una volta concesse le autorizzazioni necessarie (agendo sulla security del disco o della cartella scelta per il backup fornendo le permission di lettura/scrittura per l'utente SQLService), il tutto riprende a funzionare:


YO! 
Quante volte ci è capitato di scrivere una stringa di connessione per sviluppare un'applicazione con un db?
E di solito cosa si fa? Si va a recuperare un'altra applicazione con modificando la connectionstring 'vecchia' con quella nuova...
D'ora in poi, invece, basterà cliccare su http://www.connectionstrings.com/ per averne di tutti i tipi e con il comodo wizard basterà solo scaricarle, senza nemmeno la fatica di modificare i parametri di default.
Per SQL2005, segnalo il link diretto.
Con un'interessante query possiamo chiedere al motore di Microsoft SQL 2005 di visualizzarci lo stato di frammentazione di uno o più database.
Il codice è tratto integralmente dal sito Microsoft dedicato a SQL2005, quindi per approfondimenti potete seguire questo link.
USE MyDB
SELECT a.index_id, name, avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID(N'Production.Product'), NULL, NULL, NULL) AS a JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id;
GO
Ed ecco il risultato:

A chi interessasse il risultato completo dell'analisi del database di esempio... ecco il link per il download 
|