Quest'oggi ho avuto a che fare con un'istruzione piuttosto comoda e con un comportamento un po' indesiderato legato ad essa; si tratta di
.
Il tutto cercando di gestire una stored procedure. Stiamo parlando di SQL Server 2012 ma anche di SQL Azure Database. Il comportamento è presente in entrambe le piattaforme.
La definizione di una procedura è salvata all'interno di una tabella del catalog ed è disponibile accedendo dalla vista
sys.sql_modules (campo definition).
Eseguendo l'alter schema, la definition non sembra essere aggiornata.
Ma vediamo uno script, per capire meglio il comportamento non desiderato, creiamo gli oggetti:
USE tempdb;
GO
-- creates a new schema
CREATE SCHEMA Foo;
GO
-- creates a new table under Foo schema
CREATE TABLE Foo.Data
(
IDFoo int NOT NULL
, FooDescription varchar(100) NOT NULL
, CONSTRAINT PK_FooData PRIMARY KEY CLUSTERED
(
IDFoo
)
);
GO
-- creates stored procedure
GO
CREATE PROCEDURE Foo.proc_Foo_GetData
@IDFoo int
AS
BEGIN
SELECT
IDFoo = @IDFoo
, FooDescription
FROM
Foo.Data
WHERE
IDFoo = @IDFoo;
END;
GO
A questo punto andiamo a vedere la definizione della stored procedure appena creata:
-- gets the sp definition
SELECT
SpName = 'Foo.proc_Foo_GetData'
, [definition]
FROM
sys.sql_modules
WHERE
object_id IN (OBJECT_ID('Foo.proc_Foo_GetData'));
GO
e il risultato, corretto, è:
Andiamo ora a creare un nuovo schema, ed effettuiamo il trasferimento:
-- new schema
CREATE SCHEMA Valid;
GO
-- transfer stored procedure
ALTER SCHEMA Valid TRANSFER Foo.proc_Foo_GetData;
GO
Ricontrollando la definizione, ottengo però un risultato che non mi aspettavo:
-- gets the sp definition again
SELECT
SpName = 'Valid.proc_Foo_GetData'
, [definition]
FROM
sys.sql_modules
WHERE
object_id IN (OBJECT_ID('Valid.proc_Foo_GetData'));
GO
risultato:
come si può notare lo schema dentro alla definizione è ancora quello vecchio..
Sto lavorando sulla seguente versione di SQL Server 2012:
Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
Dec 28 2012 20:23:12
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
Ho fatto caso a questo comportamento, perchè utilizzando il
SQL Search di red-gate, dopo un'alter schema mi sono trovato oggetti nella lista di ricerca, mentre essi erano stati spostati prima.
E l'unico modo per far digerire la modifica è lanciare l'
ALTER PROCEDURE. Dopo la modifica della definizione, ovviamente, il tutto si sincronizza.
Avete mai fatto caso a questo problema?
Stay tuned!