In questi giorni in cui sono veramente occupato a riscrivere codice mi sono imbattuto in un problema abbastanza fastidioso.
Siccome piano piano il nostro database di produzione dovrà migrare verso nuovi nomi oggetto (perchè gli attuali sono inutilizzabili, e non mi soffermo) e siccome non mi posso permettere l'esecuzione di una semplice
sp_rename, ho dovuto creare un livello in più che mi simulasse la presenza dei nuovi oggetti, lasciando però inalterati gli originali.
Di conseguenza, con questo livello mi posso permettere piano piano di riscrivere tutto (e mamma mia quanto è
) senza intaccare il funzionamento delle procedure/funzioni/viste e del SQL cablato nel codice, eh sì, purtroppo anche di quello
.
I
sinonimi mi sono stati veramente di aiuto. Grazie ad essi, usati come puntatori ad oggetti già esistenti, mi posso creare le mie nuove stored procedure che puntano ai miei "nuovi" oggetti.
Dimenticavo di dire che si parla di SQL Server 2008, ma anche nel 2005 sono presenti. La loro vera funzionalità principale è quella di puntare anche ad altri database/server linkati, ma io li ho usati per creare questo livello in più, come se il mio database fosse stato completamente rinominato negli oggetti (per ora solo le tabelle, l'unità più sensibile nel mio caso).
In SQL Server 2008, come molti di voi avranno potuto notare, esiste la funzionalità di intellisense. Per i più, scomoda (sono dello stesso parere), ma in questo caso, avendo ereditato il sistema da altri sviluppatori e non conoscendolo bene, può tornare utile per mostrare i campi delle tabelle che si stanno utilizzando.
Ma cosa c'entrano i sinonimi con l'intellisense? Ebbene, purtroppo tra sinonimi ed intellisense non c'è buon rapporto. Sembra un
bug conclamato.
Il problema, non sta nel fatto che l'intellisense non funziona coi sinonimi poichè per alcune sintassi, come per il t-sql degli indici ad esempio, già non è supportato ed un messaggio lo indica.
Coi sinonimi il problema è più pesante. Per il compilatore a design time i sinonimi proprio NON ESISTONO. E vengono sottolineati come errori! guardate qui con SSMS 2008 cosa succede:
--
--
Fin qui tutto ok, adesso aggiungo il sinonimo:
Come potete notare, tutto sottolineato, errore? No, perchè se eseguite lo script, tutto funziona alla perfezione. Provatelo voi stessi:
USE tempdb;
GO
CREATE TABLE dbo.tabella
(
id int NOT NULL PRIMARY KEY CLUSTERED
, descrizione varchar(30) NOT NULL
)
GO
INSERT INTO dbo.tabella (descrizione, id)
VALUES ('prova', 1)
GO
SELECT
descrizione
, id
FROM
dbo.tabella
GO
CREATE SYNONYM dbo.syn_tabella
FOR dbo.tabella;
GO
SELECT
descrizione
, id
FROM
dbo.syn_tabella
GO
DROP TABLE dbo.tabella
DROP SYNONYM dbo.syn_tabella
Vedrete che la select del sinonimo vi restituirà un errore ma il risultato sarà quello sperato. Bug, niente da fare.
Speriamo qualche amico in Microsoft mi faccia la correzione.. Altrimenti non è poi così comodo usare i sinonimi con l'intellisense.
Se lo si disattiva, l'errore scompare. Voi potete immaginare, dopo aver fatto il livello di n decine di sinonimi, cosa significa scrivere query in cui le tabelle puntate hanno campi di cui non si conosce il nome. E l'intelliSense proprio non appare. Subito ho pensato a problemi di cache, premo CTRL-SHIFT-R, aggiorno i metadati.. niente. Sigh sob.. triste
.
Stay Tuned!