Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2008-绑定另一列';将默认值设置为主键_Sql_Sql Server - Fatal编程技术网

SQL Server 2008-绑定另一列';将默认值设置为主键

SQL Server 2008-绑定另一列';将默认值设置为主键,sql,sql-server,Sql,Sql Server,我想知道如何在SQLServer2008中最好地实现以下简单的行版本控制策略。这样做的目的是将主键字段复制到另一列(本例中为originationg_id),以便将同一对象的多个版本/修订组合在一起 当我插入初始的“version1”行时,我希望将原始\u id列默认为主键的列。这是由数据库自动生成的,所以我不知道该怎么做。后续插入将已经知道要为此字段提供的值 例如: primary_key, originating_id, date_created, some_value ----------

我想知道如何在SQLServer2008中最好地实现以下简单的行版本控制策略。这样做的目的是将主键字段复制到另一列(本例中为originationg_id),以便将同一对象的多个版本/修订组合在一起

当我插入初始的“version1”行时,我希望将原始\u id列默认为主键的列。这是由数据库自动生成的,所以我不知道该怎么做。后续插入将已经知道要为此字段提供的值

例如:

primary_key, originating_id, date_created, some_value
---------------------------------------------------------------------
1            1               13/12/2010    version1 of object A...
2            1               14/12/2010    version2 of object A...
3            1               15/12/2010    version3 of object A...
4            4               15/12/2010    version1 of object B...

谢谢。

在我看来,这是一个与实际数据一起存储的表,您可以使用它做一些事情,具体取决于您如何控制审计

  • 您可以使用SELECT SCOPE_IDENTITY()在插入到表后获取标识值,然后使用该值插入到报表表中
  • 您可以在“插入后”上使用触发器,然后就可以访问主键

  • 如果您出于某种奇怪的原因在同一个表中执行此操作,我建议您考虑可能的不同策略,因为很难查询此长期策略的“最新”版本。

    正如Mitchel Sellers所建议的,我将使用插入后触发器;在该触发器中,您将使用“inserted”表作为原始id和可能的some_value列。触发点类似于:

    CREATE TRIGGER triggername 
       ON  tablename
       AFTER insert
    AS 
    BEGIN
    
    declare @somevalue varchar(max)
    declare @originalid int
    select @somevalue = '<some query to set the description>'
    select @originalid = inserted.tablenameid
    
    insert into audittable
    select @originalid, getdate(), @somevalue
    
    
    END
    
    创建触发器触发器名称
    关于表名
    插入后
    作为
    开始
    声明@somevalue varchar(最大值)
    声明@originalid int
    选择@somevalue=''
    选择@originalid=inserted.tablenameid
    插入到审核表中
    选择@originalid,getdate(),@somevalue
    结束
    
    在您的模式中肯定有另一列将版本行定义为与对象B相关。如果您在问题中包含了该列,则不需要存储对象的第一个版本号。您可以创建一个视图来查找它,并在必要时加入该视图,而无需所有存储。同样感谢您的帖子-它在尝试触发器时提供了帮助。Mitchel,我正在实现一些相同的功能。对于第1点,SELECT SCOPE_IDENTITY()可以在表定义中用于定义列的默认值,还是必须在PROC中使用?SCOPE_IDENTITY()在查询时使用,不能将其用作默认值,因为它表示在与当前执行相同的作用域中分配的最后一个标识值。你必须自己处理这件事。