tablas tabla saving requieren recreación realizado que puedo permitted permitir permite not modificar los impedir guardar columna changes cambios sql sql-server sqlclr

tabla - saving changes is not permitted sql server



Error al CREAR UNA ASAMBLEA en SQL (5)

Acabo de encontrar exactamente el mismo problema.

Esta es una página antigua, pero primero, antes y después, la DLL debe compilarse con .NET 2.0. SqlServer 2005 se construye con .net 2.0, porque es el último disponible cuando se escribió. SqlServer 2008 también podría tener el mismo problema.

La DLL y el SqlServer deben hacer referencia a la misma versión de .NET framekwork. Una vez que me di cuenta de esto, ¡creé un proyecto separado bajo 2.0 y shazam! Trabajó perfecto la primera vez.

Para ver qué versión de .net usa su servidor SQL:

select * from sys.dm_clr_properties

Ya he buceado en la programación de clr de SQL. Desafortunadamente mi primer intento es problemático. Mi código de ensamblaje de C # es solo así:

enter code here public partial class FirstCLRRoutines { public static int GetCLRFrameworkMajorVersion() { return System.Environment.Version.Major; } }

Y el código SQL es:

USE master GO CREATE ASSEMBLY [Chapter2.FirstCLRRoutine] FROM ''D:/projeler/SQL_CLR/SQL_CLR/bin/Debug/SQL_CLR.dll''

Pero recibo este mensaje de error de MSSMSE:

Msg 6218, Nivel 16, Estado 3, Línea 1
CREAR ASAMBLEA para el ensamblaje ''SQL_CLR'' falló porque el ensamblaje ''SQL_CLR'' falló la verificación. Compruebe si los ensamblajes a los que se hace referencia están actualizados y son confiables (para external_access o no seguro) para ejecutar en la base de datos. Mensajes de error del verificador de CLR, si hay alguno, seguirá este mensaje


La biblioteca, System.Environment, no es compatible con CLR: http://msdn.microsoft.com/en-us/library/ms403279.aspx

Aún puede usarlo, como se indica en la sección "Bibliotecas no compatibles" del artículo anterior, pero tenga en cuenta que el código no se ha probado para garantizar su seguridad y confiabilidad. Esto puede causar resultados impredecibles en un entorno de producción, por lo tanto, piense en los riesgos y realice una prueba cuidadosa antes de implementar.

Además, creo que debe tener un nombre seguro o implementarse en una base de datos marcada como "Confiable" antes de que se ejecute.


La respuesta aceptada, aunque parece resolver el problema del OP, es solo parcialmente correcta y presenta una explicación demasiado simplista de la causa subyacente, que podría llevar a otras personas con un problema similar en la dirección equivocada.

El problema con la respuesta aceptada es un malentendido del entorno .NET, y ese mismo malentendido también se puede ver en la pregunta misma. Dentro de .NET, el CLR y el Framework son dos cosas separadas, cada una con sus propias versiones.

El CLR (Common Language Runtime) es lo que ejecuta el código administrado. Esto no se actualiza tan a menudo como el Marco. .NET Framework es una colección de bibliotecas que proporciona los medios básicos para interactuar con una versión particular del CLR.

Una sola versión del CLR generalmente tiene varias versiones del marco con el que funciona. Sin embargo, una única versión de Framework solo funciona con una versión específica del CLR. Por ejemplo, CLR versión 2.0 funciona con Framework versión 2.0, 3.0 y 3.5, mientras que CLR versión 4.0 funciona con todas las versiones 4.x de .NET Framework (es decir, 4.0, 4.5, 4.5.1, 4.5.2, 4.6). , etc). Para ver el cuadro de relaciones de versión CLR a versión de Framework, consulte la página de MSDN para las versiones y dependencias de .NET Framework .

Con respecto al código SQLCLR, SQL Server solo funciona con una única versión de CLR, y la versión específica depende de la versión de SQL Server. SQL Server 2005, 2008 y 2008 R2 solo funcionan con CLR versión 2. Dado que CLR versión 2 solo funciona con .NET Framework versiones 2.0, 3.0 y 3.5, esto significa que SQL Server 2005, 2008 y 2008 R2 solo funcionan con. NET Framework versiones 2.0, 3.0 y 3.5. Por supuesto, SQL Server 2005 solo incluía .NET Framework versión 2.0, por lo que hay un par de bibliotecas más nuevas en .NET Framework versión 3.0 y 3.5 que no funcionan en SQL Server 2005 sin importarlas manualmente (es decir, System.Core y System. Xml.Linq ). En esa misma línea, SQL Server 2012, 2014 y 2016 están vinculados estáticamente a CLR versión 4, que funciona con .NET Framework versiones 4.0, 4.5, 4.5.1, 4.5.2, 4.6.

Con respecto a la información devuelta de System.Environment.Version (en la pregunta) y sys.dm_clr_properties.version (en la respuesta aceptada), informan la versión de CLR , no la versión de Framework . Así que tenga cuidado de no confundir esas dos cosas que informan 2.0 o 4.0, ya que solo puede usar Framework versión 2.0 o 4.0.

Y, afortunadamente, debido a la compatibilidad con versiones anteriores, el código compilado contra las versiones de CLR 2 Framework (2.0, 3.0 y 3.5) se ejecutará sin necesidad de volver a compilarse en SQL Server 2012 y más recientes, aunque estén en la versión 4 de CLR.

Por lo tanto, generalmente no puede equivocarse con el uso de una versión de Target Framework de 2.0, pero ciertamente puede usar versiones de Framework más allá de 2.0.

Para una descripción más detallada del desarrollo del código SQLCLR, consulte el siguiente artículo (y la serie en general), que escribí:

Escalera al nivel 5 de SQLCLR: Desarrollo (usando .NET dentro de SQL Server)


Respuesta corta: configure la versión del servidor SQL y la versión de .Net Framework en la propiedad del proyecto.

Primero que todo tienes que verificar establecer la propiedad de tu proyecto. en la propiedad del proyecto, establezca la versión del servidor SQL que desea crear CLR para ella. luego elige la versión .Net Framework. por ejemplo, si desea crear CLR para SQL Server 2008, debe configurar .Net Framework en 3.5 y para 2005 elegir .Net 2.0. Espero que esta solución te ayude.


USE master GO CREATE ASSEMBLY [Chapter2.FirstCLRRoutine] FROM ''D:/projeler/SQL_CLR/SQL_CLR/bin/Debug/SQL_CLR.dll'' WITH PERMISSION_SET = UNSAFE

Intenta eso, y hazme saber si eso funciona.