Blog Maxi Accotto

Blog , cursos, coaching y Consultoria en SQL Server

 

 

 

Error Saving Changes is not permitted en el Management Studio de 2008

El SSMS (SQL Server Management Studio) de 2008 tiene varios cambios con respecto a sus versiones anteriores, a mi en lo general la mayoría me han gustado y mucho.

Uno de esos cambios es una prevención de cambios en estructuras de nuestras tablas, muchas veces cuando utilizamos esta herramienta y hacemos cambios no nos damos cuenta por debajo de ese cambio que es realmente lo que sucede, hay algunas cosas que son simples y otras un poco mas complejas, por ejemplo si quiero agregar un nuevo campo y lo hago al final de los actuales eso a nivel TSQL se resuelve con un simple ALTER TABLE, ahora bien, si ese campo en lugar de querer agregarlo ultimo lo quiero hacer en medio de otro existente no quedara otro remedio a nivel TSQL que borrar la tabla, crearla nuevamente y pasar los datos, esto no seria problema si estamos en un ambiente de desarrollo o con pocos registros, pero que sucedería si estamos en un ambiente productivo o con muchos registros? pues podríamos colapsar al sistema ya que la operación demoraría un tiempo.

Para ser mas explícitos con esto aquí abajo copio dos códigos, ambos son la salida de agregar un campo desde el SSMS a una tabla, el primero es como ultimo campo y el segundo ejemplo en el medio de algún campo actual para que podamos comparar las diferencias y que cosas tiene que hacer SQL para lograr nuestro cometido.

Ejemplo 1

BEGIN TRANSACTION
GO
ALTER TABLE dbo.EMPLEADOS ADD
    CUIT nchar(10) NULL
GO
ALTER TABLE dbo.EMPLEADOS SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
 

Ejemplo 2

BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_EMPLEADOS
    (
    LEGAJO int NOT NULL,
    NOMBRE varchar(30) NULL,
    CUIT nchar(10) NULL,
    FECHA datetime NULL,
    EDAD int NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_EMPLEADOS SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.EMPLEADOS)
     EXEC('INSERT INTO dbo.Tmp_EMPLEADOS (LEGAJO, NOMBRE, FECHA, EDAD)
        SELECT LEGAJO, NOMBRE, FECHA, EDAD FROM dbo.EMPLEADOS WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.EMPLEADOS
GO
EXECUTE sp_rename N'dbo.Tmp_EMPLEADOS', N'EMPLEADOS', 'OBJECT' 
GO
ALTER TABLE dbo.EMPLEADOS ADD CONSTRAINT
    PK__EMPLEADO__5487D90715702A09 PRIMARY KEY CLUSTERED 
    (
    LEGAJO
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.EMPLEADOS ADD CONSTRAINT
    CK__EMPLEADOS__EDAD__1758727B CHECK (([EDAD]>=(18) AND [EDAD]<=(70)))
GO
COMMIT

Como se podrá observar el segundo ejemplo puede llegar a causarnos bastantes problemas. Bien esto sucede porque el cambio que le solicitamos no tiene otra opción que hacerlo así, en otras palabras nosotros desde el SSMS podemos hacer las cosas de forma visual (de eso se trata la idea de usar parte de esta herramienta) pero todo se traduce a sentencias TSQL.

 

Ahora bien, en versiones anteriores al producto una persona podía hacer el segundo cambio sin mediar el impacto porque desconoce el mismo y la herramienta no lo previene.

Ahora y con la versión 2008 por defecto hay un seteo en las opciones que nos permite prevenir cualquier cambio vía interfaz que represente el borrado de una tabla (como en nuestro ejemplo 2), esa opción se muestra en la siguiente figura y se llama Prevent saving changes that requiere table re-reation

 

image

Al estar esta opción activada cuando hacemos un cambio que representa una regeneración de la tabla nos encontraremos con el siguiente mensaje de error: Saving Changes is not permitted 

 

image

Currently rated 4.5 by 4 people

  • Currently 4.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: Artículos
Posted by maccotto on Tuesday, April 14, 2009 2:33 PM
Permalink | Comments (3) | Post RSSRSS comment feed

Novedades en SQL 2008: Cambios en TSQL

SQL Server 2008 incorpora bastantes cambios, en esta ocasión veremos algunos referenciados a TSQL.

 

Declaración , inicialización e incremento de variables

Un cambio es el manejo de variables a nivel TSQL, ahora se asemeja cada día mas a lo que los desarrolladores estamos acostumbrados.

 

DECLARE @VAR INT = 4
SELECT @VAR
SET @VAR +=1 -- INCREMENTOS
SELECT @VAR     
 

Modificación de la sentencia INSERT

En versiones anteriores a 2008 si queríamos insertar mas de un registro debíamos usar tantos insert como registros necesitamos o bien insert en conjunto con Select.

Ahora además de esto, la sentencia insert nos permite en una sola instrucción insertar mas de un valor como se muestra a continuación

CREATE TABLE #T1 (ID INT)
GO
INSERT INTO #T1 VALUES (1),(2),(3),(4)
GO
SELECT * FROM #T1

 

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted by maccotto on Tuesday, March 24, 2009 6:10 AM
Permalink | Comments (12) | Post RSSRSS comment feed

Mi sistema realmente funciona en SQL 2005 / 2008

En muchas ocasiones me encuentro en distintas empresas que tienen su SQL Server 2005 o 2008 y me dicen que sus sistemas son compatibles con estas versiones de SQL ya que esta corriendo sus bases sobre el.

Pero en una gran parte de estos casos la cosa no es tan así como indican, que una base este sobre SQL Server 2005 o 2008 no quiere decir que sea compatible y este usando el poder de estos motores.

Como es esto? simple: se puede tener una base de datos con compatibilidad hacia atrás, o sea puedo tener una base de datos en un 2005 con compatibilidad 80 lo cual significa que la base es un 2000 no usando las features de 2005, en otras palabra no es compatible con 2005

Para lo cual es muy importante saber la compatibilidad de nuestras bases de datos, si es menor que 90 nos indica que no es ni 2005 ni 2008 compatible.

En el siguiente listado les muestro los distintos modos de compatibilidad y a que versión corresponden

Compatibilidad Versión de SQL
65 6.5
70 7.0
80 2000
90 2005
100 2008

Ahora bien, como saber en nuestro SQL que bases de datos no están siendo compatibles con la versión por mas que estén sobre ella ya que tienen una compatibilidad inferior.

La opción mas simple es ir al Management Studio o al Enterprise Manager y ver las opciones de cada base de datos en la sección options y la propiedad “Compatibility Level”

image

 

También podemos hacer esto por medio de un simple query donde nos indicara que bases de datos no están en el modo de compatibilidad adecuado, para ello yo utilizo el siguiente código

 

   1:  declare @modo smallint
   2:   
   3:  select @modo =
   4:  convert(smallint,replace(CONVERT(varchar(2),
   5:  SERVERPROPERTY('Productversion')),'.','')) * 10
   6:   
   7:  select name,cmptlevel from master..sysdatabases
   8:  where cmptlevel < @modo
 
 
 

 

 

   
  

Currently rated 5.0 by 2 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted by maccotto on Tuesday, March 24, 2009 1:37 AM
Permalink | Comments (5) | Post RSSRSS comment feed