【发布时间】:2011-06-15 02:34:10
【问题描述】:
我需要对一些关键表进行“版本控制”,并尝试以一种相当简单的方式实现它:
CREATE TABLE [dbo].[Address] (
[id] bigint IDENTITY(1, 1) NOT NULL,
[post_code] bigint NULL,
...
)
CREATE TABLE [dbo].[Address_History] (
[id] bigint NOT NULL,
[id_revision] bigint NOT NULL,
[post_code] bigint NULL,
...
CONSTRAINT [PK_Address_History] PRIMARY KEY CLUSTERED ([id], [id_revision]),
CONSTRAINT [FK_Address_History_Address]...
CONSTRAINT [FK_Address_History_Revision]...
)
CREATE TABLE [dbo].[Revision] (
[id] bigint IDENTITY(1, 1) NOT NULL,
[id_revision_operation] bigint NULL,
[id_document_info] bigint NULL,
[description] varchar(255) COLLATE Cyrillic_General_CI_AS NULL,
[date_revision] datetime NULL,
...
)
每个表都有一组插入/更新/删除触发器,用于存储其更改。
我的应用程序基于 PyQt + sqlalchemy,当我尝试插入存储在版本化表中的实体时,sqlalchemy 会触发错误:
The target table 'Heritage' of the DML statement cannot have
any enabled triggers if the statement contains
an OUTPUT clause without INTO clause.
(334) (SQLExecDirectW); [42000]
[Microsoft][ODBC SQL Server Driver]
[SQL Server]Statement(s) could not be prepared. (8180)")
我该怎么办?我必须使用 sqlalchemy。 如果有人可以给我一个建议,我如何在没有触发器的情况下实现版本控制,那就太酷了。
【问题讨论】:
-
正如错误所说,您的 SQL 语句显然包含
OUTPUT子句,对吧?你能把它变成OUTPUT (columns) INTO (table variable)子句吗?这应该(希望)解决错误提到的问题...... -
sqlalchemy 是 ORM 工具,它自己进行插入、更新和删除实体的 sql 查询:|
-
不熟悉 SQL Alchemy - 有没有办法在配置它时对它“撒谎”,以至于它认为它正在与 SQL Server 2000 实例(而不是更高版本,并假设你不需要以后的功能)? SQL Server 2000 没有 OUTPUT 子句,所以它可能不会生成这样的 SQL。
-
@Damien_The_Unbeliever 好主意,但没有办法。 sqlalchemy 从 sql 驱动程序获取实例类型 :) 但它有数据映射选项,可以解决问题。但是现在,当我将实体插入数据库时,保存查询中没有获得它的 id,我必须强制 sqlalchemy 重新读取它!我宁愿重新实现版本控制并消除触发器,这个问题相当糟糕:/
标签: sql sql-server triggers sqlalchemy