9
votes

Trouvez la colonne Date / Time d'une table a été créée

Comment pouvez-vous interroger SQL Server pour la date de création pour une colonne de table SQL Server 2005?

J'ai essayé le sp_columns [naïf] pour obtenir cette information, mais la date de création n'a pas été incluse dans cette procédure stockée.

Comment cela peut-il être fait?


1 commentaires

Vous devriez regarder Sys.Objects rejoint Sys.Columns. Sys.Objects a le champ Create_Date: TechNet.Microsoft.com/en-us/ Bibliothèque / MS190324.aspx


7 Réponses :


8
votes

Il y a cette table système nommée SyS.Columns que vous pouvez obtenir des informations de colonnes à partir de celui-ci. Si vous souhaitez voir des colonnes d'une table particulière, vous pouvez le faire comme suit: xxx

ou vous pouvez obtenir des informations de table comme ceci: xxx

Mais je n'ai pas pu trouver d'informations sur la date de création d'une colonne.

mise à jour: Ce pourrait aider.


6 commentaires

Pourquoi ne pas utiliser "Sys.Tables" pour les informations de la table ?? Pourquoi toujours aller à Sys.Objects ???


Je ne sais pas! C'est une vieille habitude je suppose :)


+1 - La date de création de colonne ne semble pas être disponible et pour le lien fourni


@marc_s La question est quand une colonne particulière a été créée et non lorsque la table a été créée.


@Stewart: Je comprends que - mais on pourrait facilement rejoindre sys.columns à sys.tables pour obtenir les informations - au lieu de toujours retourner au "Catch-tout" sys.objects vue .......


@marc_s OH OH Oui, vous avez donc voulu utiliser Sys.Tables où les requêtes de la réponse utilisent Sys.Objects. Fait plus de sens maintenant.



1
votes

Je pense qu'il n'y a aucun moyen d'obtenir une date de modification ou de création de colonnes individuelles en soi. Les requêtes données dans Ce et Cette Réponse renvoie les dates liées à la table contenant la colonne et non la colonne. Parce que les symboles Sys.Columns ont le même identifiant pour toutes les colonnes de la table. Vous pouvez vérifier cela en exécutant cette requête

select col.object_id, col.name, col.column_id
from sys.columns col
where col.object_id = 
(select o.object_id from sys.objects o where o.Name = @tableName)


1 commentaires

ou: où col.object_id = objet_id ('Table_Name') - Cela me semble plus facile



0
votes

Je ne pense pas que ces informations soient disponibles à moins que vous n'ayez quelque chose qui puisse parcourir les journaux de transaction, comme le log Explorer. Ce n'est pas une chose Tsql.


0 commentaires

1
votes

peu en retard à la fête mais trouvé quelque chose qui m'a aidé pour moi. Si vous pouvez dire que la colonne est la dernière modification de la table, alors sys.tables (modify_date) est fonctionnel.


0 commentaires

7
votes

SQL Server ne garantit pas de changements spécifiques aux tables. Si vous souhaitez ou avez besoin de ce niveau de détail, vous devez créer un déclencheur DDL (introduit dans SQL Server 2005) pouvant piéger certains événements spécifiques ou même des catégories d'événements, et enregistrer ces modifications à une table d'historique que vous créez.

Les déclencheurs DDL sont des déclencheurs "après"; Il n'y a pas d'option "au lieu de". Toutefois, si vous souhaitez interdire une action, vous pouvez simplement émettre un Rollback code> et qui annulera ce qui s'est passé. P>

la page MSDN pour DDL Triggers a beaucoup de bonnes informations sur la procédure à suivre pour piéger des événements spécifiques (c.-à-d. Alter Table Code>) et à l'aide de la fonction eventData ​​CODE>, qui renvoie XML, pour obtenir les spécifications de l'événement déclenché la gâchette, y compris la requête SQL exacte qui a été exécutée. En fait, la page MSDN de Utilisez la fonction EventData a même des exemples simples de créer un déclencheur DDL pour capturer alter Table des déclarations code> (dans le " Alter Tabley et alter les événements de la base de données "Section de la base de données" et la création d'un déclencheur DDL pour capturer les événements sur une table de journaux (dans la section "Exemple"). Puisque toutes les commandes alter Table code> incendieront ce déclencheur, vous avez besoin de Pour analyser lesquels sont spécifiques à ce que vous recherchez. Et, peut-être que vous savez que ceci est une option, capturer plus que l'ajout de colonnes est souhaité (c.-à-d. Dossier des colonnes, modifier le type de données et / ou la nullabilité, etc.) . P>

Il convient de noter que vous pouvez créer un DLL Trigger sur tous les événements Server CODE> pour des événements scopés de base de données tels que alter_table code>. p> Si vous souhaitez voir la structure du XML pour tout événement ou classe d'événements, allez à: p>

http://schemas.microsoft.com/sqlserver/2006/11/EventData/ p>

et cliquez sur" Version actuelle: ". Si Vous souhaitez voir un événement ou une classe d'événement spécifique, faites simplement une recherche (généralement Control-F dans le navigateur) sur Le nom de l'événement qui serait utilisé dans la clause "pour" de la gâchette (y compris le soulignement). Ce qui suit est le schéma pour l'événement alter_table code>: p> xxx pré>

Voici un test très simple pour voir comment cela fonctionne et ce que l'événement résultant des événements XML résultants Comme: p> xxx pré>

Nous créons d'abord une table simple et réelle dans TEMPDB (ces événements ne sont pas capturés pour les tables Temps): P>

<EVENT_INSTANCE>
  <EventType>ALTER_TABLE</EventType>
  <PostTime>2014-12-15T10:53:04.523</PostTime>
  <SPID>55</SPID>
  <ServerName>_{server_name}_</ServerName>
  <LoginName>_{login_name}_</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>tempdb</DatabaseName> <!-- casing is based on database definition -->
  <SchemaName>dbo</SchemaName>
  <ObjectName>MyAlterTest</ObjectName> <!-- casing is based on object definition -->
  <ObjectType>TABLE</ObjectType>
  <AlterTableActionList>
    <Create>
      <Columns>
        <Name>DATEcreated</Name> <!-- casing is taken from executed query -->
      </Columns>
    </Create>
  </AlterTableActionList>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"/>
    <CommandText>alTeR Table tempDB.dbo.MyALTERTest ADD DATEcreated DATETIME NOT NULL;&#x0D;
</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>


0 commentaires

1
votes
SELECT so.name,so.modify_date
FROM sys.objects as so
    INNER JOIN INFORMATION_SCHEMA.TABLES as ist
ON ist.TABLE_NAME=so.name where ist.TABLE_TYPE='BASE TABLE' AND
 TABLE_CATALOG='dbName' order by so.modify_date desc;

0 commentaires

0
votes

J'ai eu un problème où je devais reproduire des tables à un autre serveur et je voulais faire cette chose exacte, mais il n'y avait rien dans les tables sys qui m'a montré lorsqu'une colonne a été ajoutée ou modifiée. Depuis que je sais que ma table actuelle a les colonnes correctes que j'ai fait ce que j'ai fait ce qui suit dans une boucle DO:

declare @CurrentTableCount int = 0,
        @SchemaCheckTableCount = 0

  select top 1 * into TableNameSchemaCheck from OpenQuery
 (Database, 'select * from TableName where 1 = 2')

 select @CurrentTableCount = (select count(1) from sys.syscolumns c
                                inner join sys.sysobjects o on c.id = o.id
                                  where o.xtype = 'U'
                                    and o.name = 'TableName')

 select @SchemaCheckTableCount = (select count(1) from sys.syscolumns c
                                   inner join sys.sysobjects o on c.id = o.id
                                   where o.xtype = 'U'
                                     and o.name = 'TableNameSchemaCheck')

    if @CurrentTableCount <> @SchemaCheckTableCount
     begin

      insert into SchemaCheckLog
       values ('CompanyContext', getdate(), 'Schema for TableName table has changed.', 0)

       end

     drop table TableNameSchemaCheck

 end


0 commentaires