SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Conflitto tra ALTER SCHEMA e il campo definition su sys.sql_modules

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 un DDL, ALTER SCHEMA.

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.

Lo script completo qui.

Su connect, qualcosa di simile, chiuso come Won't fix..

Avete mai fatto caso a questo problema?


Stay tuned! 

Categoria: SQL Server 2012
martedì, 07 mag 2013 Ore. 11.12

Messaggi collegati


Statistiche
  • Views Home Page: 599.571
  • Views Posts: 1.065.441
  • Views Gallerie: 637.597
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003