Comment pouvez-vous interroger SQL Server pour la date de création pour une colonne de table SQL Server 2005? p>
J'ai essayé le Comment cela peut-il être fait? p> sp_columns [naïf] code> pour obtenir cette information, mais la date de création n'a pas été incluse dans cette procédure stockée. P>
7 Réponses :
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: ou vous pouvez obtenir des informations de table comme ceci: p> Mais je n'ai pas pu trouver d'informations sur la date de création d'une colonne. p> mise à jour:
Ce pourrait aider. P> P>
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 code> à sys.tables code> pour obtenir les informations - au lieu de toujours retourner au "Catch-tout" sys.objects code> 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.
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)
ou: où col.object_id = objet_id ('Table_Name') - Cela me semble plus facile
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. P>
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) code> est fonctionnel. P>
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 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. Il convient de noter que vous pouvez créer un DLL Trigger 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 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> 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> Rollback code> et qui annulera ce qui s'est passé. P> 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> 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> alter_table code>: 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;
</CommandText>
</TSQLCommand>
</EVENT_INSTANCE>
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;
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
Vous devriez regarder Sys.Objects rejoint Sys.Columns. Sys.Objects a le champ Create_Date: TechNet.Microsoft.com/en-us/ Bibliothèque / MS190324.aspx