簡體   English   中英

SQL Server始終加密的操作數類型沖突:運行EXEC sproc時,varchar與varchar(60)不兼容

[英]SQL Server Always Encrypted Operand type clash: varchar is incompatible with varchar(60) when running EXEC sproc

我無法執行存儲過程,該存儲過程使用Always Encrypted向上插入具有加密列的表。 但是,我能夠從sproc復制SQL並使用設置了參數的普通SQL運行它, 只是無法通過SSMS中的EXEC函數執行sproc時觸發sproc,這也會導致應用程序出現問題

該表上有一個觸發器,該觸發器可插入另一個具有類似結構的審計表中,該審計表也使用相同的加密方法進行了加密。 我做了平常的事情:

  • 檢查查詢選項中始終加密的啟用參數化
  • 在連接設置上設置列加密設置為啟用。
  • 刷新存儲過程的加密元數據:

      EXEC sp_refresh_parameter_encryption 'organization.uspOrganizationAddressUpsert' 

    表:

      CREATE TABLE [organization].[OrganizationAddress]( [OrganizationAddressId] [int] IDENTITY(1,1) NOT NULL, [CreatedUser] [int] NOT NULL, [CreatedDate] [datetime2](7) NOT NULL, [LastUpdateUser] [int] NOT NULL, [LastUpdateDate] [datetime2](7) NOT NULL, [RemovedDate] [datetime2](7) NULL, [Address1] [varchar](60) NOT NULL, [Address2] [varchar](60) NULL, [City] [varchar](60) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL, [State] [varchar](60) NOT NULL, [ZipCode] [varchar](60) NOT NULL, [ClientNumberId] [int] NOT NULL CREATE TABLE [audit].[OrganizationAddressAudit]( [OrganizationAddressId] [int] NOT NULL, [CreatedUser] [int] NOT NULL, [CreatedDate] [datetime2](7) NOT NULL, [LastUpdateUser] [int] NOT NULL, [LastUpdateDate] [datetime2](7) NOT NULL, [RemovedDate] [datetime2](7) NULL, [Address1] [varchar](60) NOT NULL, [Address2] [varchar](60) NULL, [City] [varchar](60) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL, [State] [varchar](60) NOT NULL, [ZipCode] [varchar](60) NOT NULL, [ClientNumberId] [int] NOT NULL, [OperationDate] [datetime] NOT NULL, [Operation] [varchar](50) NOT NULL, [OperationBy] [varchar](100) NOT NULL 

    存儲過程:

      ALTER PROCEDURE [organization].[uspOrganizationAddressUpsert] @OrganizationId INT, @ExecutingUserId INT, @Address1 VARCHAR(60), @Address2 VARCHAR(60), @City VARCHAR(60), @State VARCHAR(60), @ZipCode VARCHAR(60), @ClientNumberId INT AS BEGIN SET NOCOUNT ON DECLARE @RightNow AS DATETIME2 = SYSDATETIME() If EXISTS (Select 1 From [organization].[OrganizationAddress] Where ClientNumberId = @ClientNumberId) BEGIN UPDATE [organization].[OrganizationAddress] SET LastUpdateUser = @ExecutingUserId, LastUpdateDate = @RightNow, Address1 = @Address1, Address2 = @Address2, City = @City, [State] = @State, ZipCode = @ZipCode, RemovedDate = Null Where ClientNumberId = @ClientNumberId END ELSE BEGIN -- INSERT part of the UPSERT INSERT INTO [organization].[OrganizationAddress] (CreatedUser ,CreatedDate ,LastUpdateUser ,LastUpdateDate ,Address1 ,Address2 ,City ,[State] ,ZipCode ,ClientNumberId) VALUES (@ExecutingUserId ,@RightNow ,@ExecutingUserId ,@RightNow ,@Address1 ,@Address2 ,@City ,@State ,@ZipCode ,@ClientNumberId) END END 

    使用參數集運行存儲過程代碼很好,但是我無法執行該存儲過程:

      declare @orgId INT = 1; declare @client int = 888; declare @user int = 1; declare @Add1 varchar(60)= 'Test Address1'; declare @Add2 varchar(60)= 'Test Address2'; declare @city varchar(60) = 'City'; declare @state varchar(60) = 'St'; declare @zip varchar(60) = '12345'; EXEC organization.uspOrganizationAddressUpsert @OrganizationID=@orgID, @ExecutingUserId = @user, -- int @Address1 = @Add1, -- varchar(60) @Address2 = @Add2, -- varchar(60) @City = @city, -- varchar(60) @State = @state, -- varchar(60) @ZipCode = @zip, -- varchar(60) @ClientNumberId = @client; -- int Msg 206, Level 16, State 2, Procedure uspOrganizationAddressUpsert, Line 0 [Batch Start Line 1] Operand type clash: varchar is incompatible with varchar(60) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'BankruptcyApp') collation_name = 'SQL_Latin1_General_CP1_CI_AS' 

    我在帶有VARCHAR(60)的測試數據庫中為加密的列,觸發器和審計表創建了一個類似的表,並且該表在那里工作良好,我在表/ sproc /觸發器中找不到任何可以使它工作的差異那里而不是這里。 我已經用盡了我可以找到的其他帖子和博客。

  • 固定! 需要更新應用代碼以指定數據類型和長度:

    parameters.Add("@City", organizationAddress.City, System.Data.DbType.AnsiString, System.Data.ParameterDirection.Input, 60);
    

    以前的位置:

    parameters.Add("@City", organizationAddress.City)
    

    這至少可以使應用程序運行sproc,但仍然無法通過EXEC從SSMS運行它

    暫無
    暫無

    聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM