sql-server - usuario - funciones sql server pdf
Alterar tipos de tabla definidos por el usuario en SQL Server (7)
¿Cómo puedo modificar un tipo de tabla definido por el usuario en SQL Server?
Por lo que sé, es imposible modificar / modificar un tipo de tabla. Puede crear el tipo con un nombre diferente y luego descartar el tipo anterior y modificarlo con el nuevo nombre
Créditos a jkrajes
Según msdn , es como ''La definición del tipo de tabla definida por el usuario no se puede modificar después de msdn ''.
¡Simon Zeinstra ha encontrado la solución!
Pero, utilicé Visual Studio community 2015 y ni siquiera tuve que usar schema compare.
Usando SQL Server Object Explorer, encontré mi tipo de tabla definida por el usuario en el DB. Hice clic derecho en el tipo de tabla y lo seleccioné. Esto abrió una pestaña de código en el IDE con el código TSQL visible y editable . Simplemente cambié la definición (en mi caso solo aumentó el tamaño de un campo nvarchar) y hice clic en el botón Actualizar base de datos en la esquina superior izquierda de la pestaña.
¡Listo! - una comprobación rápida en SSMS y la definición udtt ha sido modificada.
Brillante, gracias Simon.
Aquí hay pasos simples que minimizan el tedio y no requieren secuencias de comandos semiautomáticas propensas a errores o herramientas costosas.
Tenga en cuenta que puede generar instrucciones DROP / CREATE para múltiples objetos desde la ventana Detalles del explorador de objetos (cuando se generan de esta manera, los guiones DROP y CREAR se agrupan, lo que facilita la inserción de lógica entre las acciones Deshacer y Crear):
- Haga una copia de seguridad de su base de datos en caso de que algo salga mal.
- Genere automáticamente las instrucciones DROP / CREATE para todas las dependencias (o genere para todos los objetos de "Programabilidad" para eliminar el tedio de encontrar dependencias).
- Entre las instrucciones DROP y CREATE [dependencias] (después de todo DROP, antes de todas las CREATE), inserte instrucciones DROP / CREATE [table type] generadas, realizando los cambios que necesita con CREATE TYPE.
- Ejecute el script, que elimina todas las dependencias / UDTT y luego recrea [UDTTs con alteraciones] / dependencias.
Si tiene proyectos más pequeños en los que podría tener sentido cambiar la arquitectura de la infraestructura, considere eliminar los tipos de tabla definidos por el usuario. Entity Framework y herramientas similares le permiten mover la mayoría, si no toda, su lógica de datos a su base de códigos donde es más fácil de mantener.
Debería descartar el tipo de tabla anterior y crear uno nuevo. Sin embargo, si tiene alguna dependencia (cualquier procedimiento almacenado que la use) no podrá abandonarla. He publicado otra respuesta sobre cómo automatizar el proceso de eliminar temporalmente todos los procedimientos almacenados, modificar la tabla de la tabla y luego restaurar los procedimientos almacenados.
Esto es un truco, pero parece funcionar. A continuación se muestran los pasos y un ejemplo de modificación de un tipo de tabla. Una nota es que el sp_refreshsqlmodule fallará si el cambio que realizó en el tipo de tabla es un cambio brusco en ese objeto, generalmente un procedimiento.
- Use
sp_rename
para cambiar el nombre del tipo de tabla, generalmente solo agrego z al principio del nombre. - Cree un nuevo tipo de tabla con el nombre original y cualquier modificación que necesite realizar en el tipo de tabla.
-
sp_refreshsqlmodule
por cada dependencia y ejecutesp_refreshsqlmodule
en ella. - Suelta el tipo de tabla renombrado.
EXEC sys.sp_rename ''dbo.MyTableType'', ''zMyTableType'';
GO
CREATE TYPE dbo.MyTableType AS TABLE(
Id INT NOT NULL,
Name VARCHAR(255) NOT NULL
);
GO
DECLARE @Name NVARCHAR(776);
DECLARE REF_CURSOR CURSOR FOR
SELECT referencing_schema_name + ''.'' + referencing_entity_name
FROM sys.dm_sql_referencing_entities(''dbo.MyTableType'', ''TYPE'');
OPEN REF_CURSOR;
FETCH NEXT FROM REF_CURSOR INTO @Name;
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC sys.sp_refreshsqlmodule @name = @Name;
FETCH NEXT FROM REF_CURSOR INTO @Name;
END;
CLOSE REF_CURSOR;
DEALLOCATE REF_CURSOR;
GO
DROP TYPE dbo.zMyTableType;
GO
ADVERTENCIA:
Esto puede ser destructivo para su base de datos, por lo que primero querrá probar esto en un entorno de desarrollo.
Si puede utilizar un proyecto de base de datos en Visual Studio, puede realizar los cambios en el proyecto y usar el esquema de comparación para sincronizar los cambios en su base de datos.
De esta forma, la secuencia de comandos de cambio maneja y recrea los objetos dependientes.
no puedes ALTERAR / MODIFICAR tu TIPO. Debe eliminar el existente y volver a crearlo con el nombre / tipo de datos correcto o agregar una / s nueva / s columna / s