关于使用alter schema的2个表之间的触发器和相同性的2个问题

时间:2012-06-27 07:46:01

标签: sql-server tsql triggers schema

我不确定我是如何描述我想要做的但是无论如何都会尝试,我有2个名为XYZ和bckXYZ的表。 bckXYZ是为XYZ创建的备份表。它们具有相同的列,但列顺序不同。当我在XYZ上创建一个触发器(带星号)时,SQL会给我一个与列顺序相关的错误。正如我所说,他们的列是相同的,但订单不是!

我有两个选项,要么我将列名逐个放入选择脚本而不是使用星号,要么将bckXYZ的架构更改为XYZ。

问题1:为什么触发器需要相同的列顺序?这是荒谬的吗?

问题2:我需要做的是使他们的模式看起来一样,所以有没有脚本可以做到这一点?

不工作

ALTER TRIGGER [dbo].[XYZ_Ins]
ON [dbo].[XYZ]
FOR  INSERT

AS
INSERT INTO dbo.bckXYZ 
SELECT    inserted.*
FROM         inserted

IT工作

ALTER TRIGGER [dbo].[XYZ_Ins]
ON [dbo].[XYZ]
FOR  INSERT

AS
INSERT INTO dbo.bckXYZ (a,b,c,d,e)
SELECT    (a, b, c, d, e)
FROM         inserted

1 个答案:

答案 0 :(得分:1)

  

问题1:为什么触发器需要相同的列顺序?这太荒谬了吗?

不,这并不荒谬 - 在构成select命令一部分的INSERT ... SELECT语句中,列名不是 required (列可以是计算和未命名的)。所有它必须继续(在这种情况下)是列顺序。

  

问题2:我需要做的是让他们的模式看起来一样,所以有任何脚本可以做到吗?

没有SQL命令可以重新排列表中的列。如果要更改表中列的顺序 - 则不能。如果您使用例如SSMS,它在幕后的作用是创建一个带有调整后布局的 new 表,复制所有数据,删除旧表并重命名新表。


所有这些,甚至如果两个表具有相同的列顺序,我仍然会在INSERT ... SELECT语句中写出显式列名。我对select *感到满意的唯一地方是a)在EXISTS()测试中,b)在一次性/刮擦查询中。