Sql-Server

在 SQL Server 中全域保存一個變數,並在需要時使用它

  • November 10, 2014

我們正在使用ENCRYPTBYPASSPHRASE加密某些數據庫的某些列。每次我們需要使用 DECRYPTBYPASSPHRASE 傳遞密碼時解密這些值。

所以我打算創建一個儲存過程如下圖

CREATE function [dbo].[SQLEncrypt](@str varchar(max)) returns varchar(max) 
as 
begin
declare @test nvarchar(max)
set @test=''


   set @test =   convert(varchar(MAX),DECRYPTBYPASSPHRASE ('password',@str))



return @test
END

GO

我可以使用如下所示的儲存過程來解密列

----usgae---

select master.dbo.SQLEncrypt(columnname) from tablename--
-----------------

現在我打算將此密碼全域儲存在 SQL Server 中的某個地方(不知道是否可能),然後在儲存過程中使用它。無論如何都可以做到嗎?我也可以對使用者隱藏密碼嗎?

別。

雖然可以使用context_info,但對於密碼來說,這是一個非常非常糟糕的選擇。所有具有 VIEW SERVER STATE 的使用者都會在sys.dm_exec_sessions. SQL Profiler 在您設置它時不會知道您在做什麼,也不會在生成的事件中混淆它。還有更多類似的壞處。

而是使用適當的加密層次結構。不要用密碼加密數據,永遠不是正確的選擇。而是使用對稱密鑰對其進行加密。然後使用密碼在會話中打開密鑰,請參閱OPEN SYMMETRIC KEY。密鑰將在您的會話中可用,並且可以自動解密數據。這是推薦的方法,不要試圖超越它。

Context_info 就像一個全域變數。它是二進制的,因此每次使用時都需要一些工作來提取密碼。BOL 有詳細資訊和範例。

引用自:https://dba.stackexchange.com/questions/82295