我有一个关于事务的非常简单的问题。(在SQL Server 2000中,但我想它适用于一般的数据库事务)。
tblPrimaryKey
但是这种方法不起作用。有人能提供一个应用此逻辑的工作事务示例吗?
更新:
一致性 这个特征意味着在事务之前和之后数据库应该是一致的。
在任何情况下,部分事务都不能提交到数据库中,因为那会使数据库处于不一致状态。
这是否意味着在事务中不一致是可能的?
更新:
有些人问我为什么在这种情况下没有使用更新。有点复杂,但我试着解释一下:所需的sql是发布脚本的一部分,它从视图构建表,然后更新这些表。由于视图包含发布模型,因此对视图进行了更改,仅仅只是在那里进行了更改。脚本的其余部分不能依赖列名来进行更新。
当然,我可以查询这些列名,但当时似乎有点麻烦,所以我选择不这样做,而是删除约束并重新构建它们。现在我必须承认,我自己对这个解决方案感到不舒服,所以现在我确实使用更新。我编写了一个存储过程来执行这个操作,如果有其他解决方案,请让我知道。
PkId
-----
1
2
3
tblForeignKey
Id ForeignKey
---- -----
1 1
2 2
3 3
4 1
我有两个表,一个引用另一个表(tblForeignKey.ForeignKey引用tblPrimaryKey.PkID)。现在我有一些逻辑,通过删除和重新插入键来更改主键表。
删除后,数据库当然处于不一致状态。我看了我的一个旧脚本,在其中我首先删除了关系,然后重新创建了它。但我的问题是:我了解到事务是原子的,因此在事务内允许不一致状态。
所以我想这样做应该可以:
BEGIN TRAN eg
DELETE tblPrimaryKey WHERE PkId = 3
INSERT INTO tblPrimaryKey SELECT 3
COMMIT TRAN eg
但是这种方法不起作用。有人能提供一个应用此逻辑的工作事务示例吗?
更新:
一致性 这个特征意味着在事务之前和之后数据库应该是一致的。
在任何情况下,部分事务都不能提交到数据库中,因为那会使数据库处于不一致状态。
这是否意味着在事务中不一致是可能的?
更新:
有些人问我为什么在这种情况下没有使用更新。有点复杂,但我试着解释一下:所需的sql是发布脚本的一部分,它从视图构建表,然后更新这些表。由于视图包含发布模型,因此对视图进行了更改,仅仅只是在那里进行了更改。脚本的其余部分不能依赖列名来进行更新。
当然,我可以查询这些列名,但当时似乎有点麻烦,所以我选择不这样做,而是删除约束并重新构建它们。现在我必须承认,我自己对这个解决方案感到不舒服,所以现在我确实使用更新。我编写了一个存储过程来执行这个操作,如果有其他解决方案,请让我知道。
CREATE PROC usp_SyncRecords
(
@tableName1 as nvarchar(255),
@tableName2 as nvarchar(255),
@joinClause as nvarchar(255),
@whereClause as nvarchar(1000)
)
-- this proc updates all fields in table 1 that have corresponding names
-- in table2 to the value of the field in table2.
AS
BEGIN
DECLARE @sqlClause nvarchar(4000)
DECLARE @curFieldName nvarchar(255)
DECLARE @sqlColumnCursorClause nvarchar(1000)
SET @sqlClause = 'UPDATE [' + @tableName1 + '] SET '
-- get FieldNames for second table
SET @sqlColumnCursorClause =
'DECLARE cur CURSOR FAST_FORWARD FOR SELECT name FROM syscolumns ' +
'WHERE id=' + CAST(object_id(@tableName2) as nvarchar(50))
EXEC sp_executeSql @sqlColumnCursorClause
OPEN cur
-- compose sqlClause using fieldnames
FETCH NEXT FROM CUR INTO @curFieldName
WHILE @@fetch_status <> -1
BEGIN
SET @sqlClause = @sqlClause + @curFieldName + '=' +
@tableName2 + '.' + @curFieldName + ','
FETCH NEXT FROM CUR INTO @curFieldName
END
CLOSE cur
DEALLOCATE cur
-- drop last comma
SET @sqlClause = LEFT(@sqlClause,LEN(@sqlClause) -1)
-- adding from/join/where clauses
SET @sqlClause = @sqlClause + ' FROM [' + @tableName1 + '] INNER JOIN [' + @tableName2 + '] '
+ 'ON ' + @joinClause + ' WHERE ' + @whereClause
EXEC sp_executeSQL @sqlClause
END