¿Como modificar funciones referenciadas sin regenerar todos los datos?

03/10/2007 - 20:59 por Mauro Pasetti | Informe spam
Hola, estoy empezando a trabajar con SQL Server 2005 y me doy con que no
puedo realizar ALTER TABLE ni BORRADO de funciones que están siendo
referenciadas por una tabla (con un campo calculado).
Esto no me sucede en SQL Server 2000.
La única forma que encuentro para desvincular la Función y poder modificarla
implica un movimiento enorme de datos.
La función es simple y tiene una modificación que no afecta el resultado
pero igualmente no me deja hacerlo.

Aquí les dejo los mensajes de error (son todos del mismo tenor, por lo cual
implican migrar muchísimos datos a tablas temporales para realizar el
cambio). Muchas gracias por sus sugerencias y respuestas.

Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDevolverFecha' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDevolverHora' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHora' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHoraMSeg' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHoraSeg' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHoraTxt' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECFechaSQL_Char' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECHoraSQL_Char' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECHoraSQL_CharMs' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECSegsHora' porque se le hace referencia
en el objeto 'MECResumenDiarioTiempos'.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
03/10/2007 - 22:50 | Informe spam
Hola Mauro,

Si la columna calculada no tiene propiedad "PERSISTED" (ss 2005), entonces
puedes eliminar la columna calculada, modificar la funcion y luego adicionar
la columna calculada nuevamente, sin necesidad de mover data, solo metadata.
Claro esta que debes hacerlo en todas las tablas que referencian a esta
funcion desde una columna calculada.

CREATE FUNCTION dbo.ufn_f1 (
@i INT
)
RETURNS INT
AS
BEGIN
RETURN @i
END
GO

CREATE TABLE dbo.t1 (
c1 INT NOT NULL IDENTITY,
c2 AS dbo.ufn_f1(10)
)
GO

INSERT INTO dbo.t1 DEFAULT VALUES
GO

SELECT * FROM dbo.[t1]
GO

ALTER TABLE dbo.t1
DROP COLUMN c2
GO

ALTER FUNCTION dbo.[ufn_f1] (
@i INT
)
RETURNS INT
AS
BEGIN
RETURN @i * 2
END
GO

ALTER TABLE dbo.t1
ADD c2 AS dbo.ufn_f1(10)
GO

INSERT INTO dbo.t1 DEFAULT VALUES
GO

SELECT * FROM dbo.[t1]
GO

DROP TABLE dbo.[t1]
GO

DROP FUNCTION dbo.[ufn_f1]
GO


AMB

"Mauro Pasetti" wrote:

Hola, estoy empezando a trabajar con SQL Server 2005 y me doy con que no
puedo realizar ALTER TABLE ni BORRADO de funciones que estn siendo
referenciadas por una tabla (con un campo calculado).
Esto no me sucede en SQL Server 2000.
La nica forma que encuentro para desvincular la Funcin y poder modificarla
implica un movimiento enorme de datos.
La funcin es simple y tiene una modificacin que no afecta el resultado
pero igualmente no me deja hacerlo.

Aqu les dejo los mensajes de error (son todos del mismo tenor, por lo cual
implican migrar muchsimos datos a tablas temporales para realizar el
cambio). Muchas gracias por sus sugerencias y respuestas.

Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDevolverFecha' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDevolverHora' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHora' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHoraMSeg' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHoraSeg' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHoraTxt' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECFechaSQL_Char' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECHoraSQL_Char' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECHoraSQL_CharMs' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECSegsHora' porque se le hace referencia
en el objeto 'MECResumenDiarioTiempos'.

Respuesta Responder a este mensaje
#2 GauchoNET
04/10/2007 - 16:10 | Informe spam
Perdón Alejandro por responder a tu cuenta (hace 5 años que no trabajo en
los foros y ya se me olvidaba como responder). Copio aca el mismo
mensaje
Gracias Alejando, lo que me decís es exactamente la forma de hacerlo en mi
caso ya que todas esas columnas NO SON PERSISTED.

Lamentablemente, pierdo el orden de los campos haciendo las cosas de esta
forma... (un poco maníaco nomás).
Por lo demás, creo que es la mejor opción. Muchísimas gracias.

"Alejandro Mesa" escribió en el
mensaje de noticias
news:
Hola Mauro,

Si la columna calculada no tiene propiedad "PERSISTED" (ss 2005), entonces
puedes eliminar la columna calculada, modificar la funcion y luego
adicionar
la columna calculada nuevamente, sin necesidad de mover data, solo
metadata.
Claro esta que debes hacerlo en todas las tablas que referencian a esta
funcion desde una columna calculada.

CREATE FUNCTION dbo.ufn_f1 (
@i INT
)
RETURNS INT
AS
BEGIN
RETURN @i
END
GO

CREATE TABLE dbo.t1 (
c1 INT NOT NULL IDENTITY,
c2 AS dbo.ufn_f1(10)
)
GO

INSERT INTO dbo.t1 DEFAULT VALUES
GO

SELECT * FROM dbo.[t1]
GO

ALTER TABLE dbo.t1
DROP COLUMN c2
GO

ALTER FUNCTION dbo.[ufn_f1] (
@i INT
)
RETURNS INT
AS
BEGIN
RETURN @i * 2
END
GO

ALTER TABLE dbo.t1
ADD c2 AS dbo.ufn_f1(10)
GO

INSERT INTO dbo.t1 DEFAULT VALUES
GO

SELECT * FROM dbo.[t1]
GO

DROP TABLE dbo.[t1]
GO

DROP FUNCTION dbo.[ufn_f1]
GO


AMB

"Mauro Pasetti" wrote:

Hola, estoy empezando a trabajar con SQL Server 2005 y me doy con que no
puedo realizar ALTER TABLE ni BORRADO de funciones que estn siendo
referenciadas por una tabla (con un campo calculado).
Esto no me sucede en SQL Server 2000.
La nica forma que encuentro para desvincular la Funcin y poder
modificarla
implica un movimiento enorme de datos.
La funcin es simple y tiene una modificacin que no afecta el resultado
pero igualmente no me deja hacerlo.

Aqu les dejo los mensajes de error (son todos del mismo tenor, por lo
cual
implican migrar muchsimos datos a tablas temporales para realizar el
cambio). Muchas gracias por sus sugerencias y respuestas.

Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDevolverFecha' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDevolverHora' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHora' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHoraMSeg' porque se le
hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHoraSeg' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECDiferenciaHoraTxt' porque se le hace
referencia en el objeto 'MECResumenDiarioTiempos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECFechaSQL_Char' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECHoraSQL_Char' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECHoraSQL_CharMs' porque se le hace
referencia en el objeto 'Contactos'.
Msg 3729, Level 16, State 1, Line 3
No se puede DROP FUNCTION 'dbo.Fn_MECSegsHora' porque se le hace
referencia
en el objeto 'MECResumenDiarioTiempos'.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida