Door de gebruiker gedefinieerde tabeltypen wijzigen in SQL Server

Hoe kan ik een door de gebruiker gedefinieerd tabeltype in SQL Server wijzigen?


Antwoord 1, autoriteit 100%

Voor zover ik weet is het onmogelijk om een ​​tabeltype te wijzigen/aan te passen
kan het type met een andere naam maken en vervolgens het oude type laten vallen
en wijzig het in de nieuwe naam

Tegoeden aan jkrajes

Volgens msdnis het als ‘De door de gebruiker gedefinieerde tabeltypedefinitie kan niet worden gewijzigd nadat deze is gemaakt’.


Antwoord 2, autoriteit 54%

Dit is een soort hack, maar het lijkt te werken. Hieronder vindt u de stappen en een voorbeeld van het wijzigen van een tabeltype. Een opmerking is dat de sp_refreshsqlmodule zal mislukken als de wijziging die u aanbrengt in het tabeltype een ingrijpende wijziging in dat object is, meestal een procedure.

  1. Gebruik sp_renameom het tabeltype te hernoemen, meestal voeg ik z toe aan
    het begin van de naam.
  2. Maak een nieuw tabeltype met de originele naam en eventuele wijzigingen
    je moet het tabeltype aanpassen.
  3. Doorloop elke afhankelijkheid en voer sp_refreshsqlmoduleerop uit.
  4. Laat het hernoemde tabeltype vallen.

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

WAARSCHUWING:

Dit kan destructief zijn voor uw database, dus u wilt dit eerst in een ontwikkelomgeving testen.


Antwoord 3, autoriteit 20%

Hier zijn eenvoudige stappen die verveling minimaliseren en geen foutgevoelige semi-geautomatiseerde scripts of dure tools vereisen.

Houd er rekening mee dat u DROP/CREATE-instructies voor meerdere objecten kunt genereren vanuit het venster Details van Objectverkenner (wanneer ze op deze manier worden gegenereerd, worden DROP- en CREATE-scripts gegroepeerd, wat het gemakkelijk maakt om logica in te voegen tussen de acties Drop en Create):

  1. Maak een back-up van uw database voor het geval er iets misgaat!
  2. Genereer automatisch de DROP/CREATE-instructies voor alle afhankelijkheden (of genereer voor alle “Programmability”-objecten om de verveling van het vinden van afhankelijkheden te elimineren).
  3. Tussen de DROP- en CREATE [dependencies]-instructies (uiteindelijk DROP, vóór alle CREATE), plaatst u gegenereerde DROP/CREATE [tabeltype]-instructies en brengt u de benodigde wijzigingen aan met CREATE TYPE.
  4. Voer het script uit, dat alle afhankelijkheden/UDTT’s verwijdert en vervolgens [UDTT’s met wijzigingen]/afhankelijkheden opnieuw maakt.

Als u kleinere projecten heeft waarbij het zinvol kan zijn om de infrastructuurarchitectuur te wijzigen, kunt u overwegen om door de gebruiker gedefinieerde tabeltypen te elimineren. Met Entity Framework en vergelijkbare tools kunt u de meeste, zo niet alle, gegevenslogica naar uw codebasis verplaatsen, waar deze gemakkelijker te onderhouden is.


Antwoord 4, autoriteit 12%

Als u een databaseproject in Visual Studio kunt gebruiken, kunt u uw wijzigingen in het project aanbrengen en schemavergelijking gebruiken om de wijzigingen naar uw database te synchroniseren.

Op deze manier wordt het verwijderen en opnieuw maken van de afhankelijke objecten afgehandeld door het wijzigingsscript.


Antwoord 5, autoriteit 11%

Simon Zeinstra heeft de oplossing gevonden!

Maar ik gebruikte Visual Studio community 2015 en ik hoefde niet eens schema-vergelijking te gebruiken.

Met SQL Server Object Explorer vond ik mijn door de gebruiker gedefinieerde tabeltype in de DB. Ik klikte met de rechtermuisknop op het tabeltype en selecteerde . Dit opende een codetabblad in de IDE met de TSQL-code zichtbaar en bewerkbaar. Ik heb gewoon de definitie gewijzigd (in mijn geval alleen de grootte van een nvarchar-veld vergroot) en op de knop Database bijwerkenin de linkerbovenhoek van het tabblad geklikt.

Hallo Presto! – een snelle controle in SSMS en de udtt-definitie is gewijzigd.

Briljant – bedankt Simon.


Antwoord 6, autoriteit 5%

U moet het oude tabeltype verwijderen en een nieuwe maken. Als het echter afhankelijkheden heeft (alle opgeslagen procedures die het gebruiken), kunt u het niet laten vallen. Ik heb een ander antwoord gepostover hoe te automatiseren het proces waarbij alle opgeslagen procedures tijdelijk worden verwijderd, de tabeltabel wordt gewijzigd en vervolgens de opgeslagen procedures worden hersteld.


Antwoord 7, autoriteit 4%

u kunt uw TYPE niet WIJZIGEN/WIJZIGEN. U moet de bestaande verwijderen en opnieuw maken met de juiste naam/gegevenstype of een nieuwe kolom/kolommen toevoegen


Antwoord 8, autoriteit 3%

Moest gewoon dit door de gebruiker gedefinieerde tabeltype wijzigen in een van mijn projecten. Dit zijn de stappen die ik heb toegepast:

  1. Vind alle SP met behulp van het door de gebruiker gedefinieerde tabeltype.
  2. Bewaar een aanmaakscript voor alle gevonden SP(‘s).
  3. Laat de SP(‘s) vallen.
  4. Sla een aanmaakscript op voor de door de gebruiker gedefinieerde tabel die u wilt wijzigen.
    4.5 Voeg de extra kolom of wijzigingen toe die u nodig heeft aan het door de gebruiker gedefinieerde tabeltype.
  5. Laat het door de gebruiker gedefinieerde tabeltype vallen.
  6. Voer het aanmaakscript uit voor het door de gebruiker gedefinieerde tabeltype.
  7. Voer het aanmaakscript uit voor de SP(‘s).
  8. Begin dan de SP(‘s) dienovereenkomstig aan te passen.

Other episodes