编辑将答案的上下文特定部分添加到底部
- 每个用户都有一个登录。
- 将这些登录信息与 SQL Server 用户联系起来。
- 使用 SYSTEM_USER(例如:选择 SYSTEM_USER)进行审核。
上述变得棘手的唯一地方是网络应用程序。
- 我不知道您的 Web 应用程序是否是内部的(如果它是内部的,使用带有模拟/委托的 Windows 身份验证会很好用)
- 如果它是外部的,您将拥有一个系统定义的帐户,该帐户将验证登录到 Web 应用程序(并可能执行其他特权操作),那么您可以在会话期间使用用户自己的凭据进行数据库访问。
- 如果您不想拥有一堆 SQL Server 用户,您可以进行自己的会话管理并即时创建/删除用户(例如当他们登录/注销时)
这里有一些 T-SQL 来说明
-- AFTER SUCCESSFUL LOGIN
BEGIN
-- You would already have the user name and password
DECLARE @user varchar(32)
SET @user = 'tester'
DECLARE @pw varchar(32)
SET @pw = 'SuperTest123'
-- if the user logs in from 2 different sessions
-- keep the name more unique
SELECT @user = @user + REPLACE(NEWID(), '-', '')
-- build the dynamic sql to create a user
DECLARE @sql varchar(8000)
SELECT @sql = 'CREATE LOGIN [' + @user + '] WITH PASSWORD = ''' + @pw + '''; '
SELECT @sql = @sql + 'USE MyDatabase; CREATE USER [' + @user + '] FOR LOGIN [' + @user + '] WITH DEFAULT_SCHEMA = db_datareader; '
EXEC(@sql)
-- use these credentials for web apps sql connections
SELECT @user [UserName], @pw [Password]
END
-- AFTER LOGOUT / SESSION EXPIRATION
BEGIN
-- You would already have the user+guid used by the sql server
DECLARE @login varchar(32)
SET @login = 'tester3C8DA60B996C4E5881774D1FE4'
-- build the dynamic sql to drop user
DECLARE @sql varchar(8000)
SELECT @sql = 'DROP LOGIN [' + @login + ']; '
SELECT @sql = @sql + 'USE MyDatabase; DROP USER [' + @login + ']; '
EXEC(@sql)
-- user gone until next session
END
上下文约束可以直接在审计触发器中实现。
这可能有点油嘴滑舌,但是...
IF EXIST(SELECT [Reason] FROM [TEMP_AUDITREASON] WHERE [User] = SYSTEM_USER AND [Reason] IS NOT NULL)
BEGIN
SELECT @REASON = [Reason] FROM [TEMP_AUDITREASON] WHERE [User] = SYSTEM_USER
-- clear it for the next transaction
DELETE FROM [TEMP_AUDITREASON] WHERE [User] = SYSTEM_USER
END
ELSE
BEGIN
-- SOUND THE ALARM!!! no reason was given
END