2017-07-21 1 views
1

Ich habe eine gespeicherte Prozedur, die einen symmetrischen Schlüssel entschlüsselt dann eine Einfügung in eine Tabelle ausführt, wenn der entschlüsselte Wert einem Wert in einer anderen Tabelle entspricht.Führen Sie einen Masseneinfüge- und Entschlüsselungs-symmetrischen Schlüssel in SQL Server 2014 aus

Ich möchte, dass die Prozedur geändert wird, um eine Masseneinfügung durchzuführen, anstatt die DB-Verbindung in jeder Zeile zu öffnen und zu schließen, um den Vorgang durchzuführen.

Mein Gedanke war, eine Entschlüsselung für die gesamte Spalte (EmployeeSeed.SEED) dann eine Verknüpfung auf Employee_FN innerhalb der Insert-Anweisung durchzuführen.

Hat jemand irgendwelche Empfehlungen, wie man dies in einen Masseneinsatz umwandelt?

Hier ist mein Code:

USE [Tracker] 
GO 

/****** Object: StoredProcedure [dbo].[VACATION] Script Date: 7/20/2017 3:10:18 PM ******/ 
SET ANSI_NULLS ON -- return no rows if null value is present 
GO 
SET QUOTED_IDENTIFIER ON -- define literals to be delimited by '' and identifiers by "" 
GO 

ALTER PROCEDURE [dbo].[VACATION] 
    @ID nvarchar(40), 
    @HOURS float, 
    @DESC nvarchar(max), 
    @TYPE nvarchar(50) 
AS 

OPEN SYMMETRIC KEY EmployeeCert_Key 
     DECRYPTION BY CERTIFICATE EmployeeCert 

BEGIN 

-- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @seed VARBINARY(16) 
    DECLARE @EMPLOYEE_FN nvarchar(20) 


--Select Employee FN based on Decrypted ID 
SET @EMPLOYEE_FN = 
(

SELECT EMPLOYEE.[EMPLOYEE_FN] 

FROM Employee 
JOIN EmployeeSeed 
    ON Employee.EMPLOYEE_FN = EMPLOYEESEED.EMPLOYEE_FN 
WHERE (CONVERT(nvarchar,      -- Convert from binary to NVARCHAR 
     DECRYPTBYKEY(ID, 1,    -- Designate column (1 is same as encrypted) 
     HASHBYTES('SHA1', EmployeeSeed.SEED))) -- SHA1 seed 
     = @ID) 
) 

--insert into table 
IF @EMPLOYEE_FN is not null 
BEGIN 
    INSERT INTO [dbo].VACATION_BENEFIT 
      ([EMPLOYEE_FN] 
      ,[HOURS] 
      ,[TYPE] 
      ,[DESC]) 
      VALUES 
       (@EMPLOYEE_FN, 
       @HOURS, 
       @TYPE, 
       @DESC) 

END 

CLOSE SYMMETRIC KEY EmployeeCert_Key 
END 

Antwort

0

Sie benutzerdefinierte Typ-Tabelle erstellen können Massendaten zu übergeben.

CREATE TYPE UT_VacationDetails AS TABLE 
    ( 
    ID nvarchar(40), 
    [HOURS] float, 
    [DESC] nvarchar(max), 
    [TYPE] varchar(50) 
    ) 
    GO 
    USE [Tracker] 
    USE [Tracker] 
    GO 
    /****** Object: StoredProcedure [dbo].[VACATION] Script Date: 
    7/20/2017 3:10:18 PM ******/ 
    SET ANSI_NULLS ON -- return no rows if null value is present 
    GO 
    SET QUOTED_IDENTIFIER ON -- define literals to be delimited by '' and 
    identifiers by "" 
    GO 


    ALTER PROCEDURE [dbo].[VACATION] 
      -- Add the parameters for the stored procedure here 
      @UT_details UT_VacationDetails readonly 
    AS 

    OPEN SYMMETRIC KEY EmployeeCert_Key 
    DECRYPTION BY CERTIFICATE EmployeeCert 

    BEGIN 

    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @seed VARBINARY(16) 
    DECLARE @EMPLOYEE_FN nvarchar(20) 

    INSERT INTO [dbo].VACATION_BENEFIT ([EMPLOYEE_FN] 
     ,[HOURS] 
     ,[TYPE] 
     ,[DESC]) 
    SELECT EMPLOYEE.[EMPLOYEE_FN],T.[HOURS], T.[Type],T.[DESC] 
    FROM Employee 
    JOIN EmployeeSeed 
    ON Employee.EMPLOYEE_FN = EMPLOYEESEED.EMPLOYEE_FN 
    INNER JOIN @UT_details t On t.ID= (CONVERT(nvarchar, DECRYPTBYKEY(ID, 1, 
    HASHBYTES('SHA1', EmployeeSeed.SEED))) 



    CLOSE SYMMETRIC KEY EmployeeCert_Key 
    END 
+0

Danke - ich werde dies versuchen und lassen Sie wissen, ob es funktioniert. – erikpasta2073364