¿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'.
 

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'.

Preguntas similares