1

我有一个表 atbl_UserSetting,其中有一列名称为 ID,它是具有标识和种子/增量的主键。

在此处输入图像描述

普通用户可以通过视图访问此表。这是视图:

CREATE OR ALTER   VIEW [dbo].[atbv_UserSetting]
AS
SELECT        ID, User_ID, [Key], Value
FROM            dbo.atbl_UserSetting AS US
WHERE        EXISTS
    (SELECT        TOP (1) 1 AS Expr1
    FROM            dbo.atbl_User AS U
    WHERE        (ID = US.User_ID) AND (Login = SUSER_NAME()))

现在,当我运行此查询时,它将返回 true (1):

SELECT COLUMNPROPERTY(OBJECT_ID('atbv_UserSetting'),'ID','IsIdentity')

INFORMATION_SCHEMA.COLUMNS 也一样。

但是,如果我将视图更改为此(加入用户表):

CREATE OR ALTER   VIEW [dbo].[atbv_UserSetting]
AS
SELECT        US.ID, US.User_ID, US.[Key], US.Value
FROM            dbo.atbl_UserSetting AS US
INNER JOIN dbo.atbl_User AS U ON U.ID = US.User_ID
WHERE U.[Login] = SUSER_NAME()

列的相同属性返回 false (0)。

这反过来会导致 SqlBuilder 生成带有 ID 列的插入命令,并且当在 SqlAdapter 上调用 Update 时,它​​将失败,因为 IDENTITY_INSERT 设置为 OFF。当视图使用 WHERE 子句而不是加入另一个表时,columnproperty 为 IsIdentity 返回 true(1),并且 SqlBuilder 正确地不包括插入命令中的 ID 列。

所以我的问题是,当其他表加入时,为什么 SQL Server 不能识别视图的列属性“IsIdentity”的正确值?

4

0 回答 0