【问题标题】:Preventing execution of a query if a specific parameter is not present in T-SQL如果 T-SQL 中不存在特定参数,则阻止执行查询
【发布时间】:2016-05-03 02:16:25
【问题描述】:

使用 T-SQLMicrosoft SQL Server 2014,我试图找到一种方法来限制对不存在特定参数的表的访问。 p>

我可以在 SQL Server 2016 上执行此操作,方法是创建一个利用 SESSION_CONTEXT() 函数的函数,然后将其应用于我的架构。

由于我在 SQL Server 2014 中无权访问 SESSION_CONTEXT(),因此无法在当前会话上下文中获取指定键的值。

任何人都可以提出一个解决方案,使我能够规避在这种情况下使用 SESSION_CONTEXT() (或提出更好的解决方案)

SQL Server 2016 兼容的 T-SQL

CREATE SCHEMA RestrictSchema
GO

CREATE FUNCTION RestrictSchema.DenyWithoutParameter (@Parameter INT)
RETURNS TABLE
    WITH SCHEMABINDING
AS
RETURN

SELECT 1 AS VALID_PARAMETER_SUPPLIED
WHERE @Parameter = CAST(SESSION_CONTEXT(N'@Parameter') AS INT)
GO

CREATE SECURITY POLICY RestrictSchema.ScehmaParameterRequirementForTableX 

  ADD FILTER PREDICATE RestrictSchema.DenyWithoutParameter (@Parameter) ON dbo.TableX
 ,ADD BLOCK PREDICATE RestrictSchema.DenyWithoutParameter (@Parameter) ON dbo.TableX

GO

【问题讨论】:

  • context_info 能满足您的需求吗?
  • 我了解您在技术上想要完成的工作,但您为什么要尝试完成它?

标签: sql-server tsql sql-server-2014


【解决方案1】:

RestrictSchema 架构中创建一个表,

  • 会话ID
  • 参数键
  • 参数值
  • 生存时间

根据需要为每个会话/连接添加一个条目,然后重写RestrictSchema.DenyWithoutParameter 以从中选择,偶尔进行垃圾收集。

【讨论】:

  • 不错的方法@dlatikay。我会试一试,让你知道我的进展情况。
猜你喜欢
  • 2022-12-05
  • 2019-05-23
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2021-02-19
  • 2019-07-28
  • 2012-05-28
相关资源
最近更新 更多