我有一个表 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”的正确值?