【问题标题】:Grant permissions for specific time of day授予一天中特定时间的权限
【发布时间】:2017-07-01 14:40:59
【问题描述】:

是否可以授予用户权限,例如公司的营业时间。

GRANT SELECT 
ON client
  <WHERE CONDITION>
TO Emily 

我知道使用 MySQL 可以做到这一点,您可以在授权选项中添加 WHERE 子句,以便向其添加上下文条件。但是,我正在使用 MS SQL Server,可以在那里完成吗?

另一种解决方案是添加一个 SQL 作业以在特定时间添加和删除权限,但我不太喜欢这样,我更愿意在授予级别上执行此操作。

【问题讨论】:

  • 如果您根本不希望他们能够连接,您也可以使用logon trigger - 但是当到期时间过去时,这对于终止已经打开的连接没有任何作用。
  • 您可以创建一个视图,该视图仅在视图上授予选择的特定时间给出结果

标签: sql sql-server rights-management


【解决方案1】:

我喜欢@Turo关于使用视图的建议。

它可能只是由类似的东西组成

CREATE VIEW dbo.TimeFilteredClient
AS
  SELECT *
  FROM   dbo.Client
  WHERE  CAST(GETDATE() AS TIME) BETWEEN '09:00' AND '17:00' 

然后授予 Emily 对视图而不是表的权限。只要视图和表共享同一个所有者,她就可以从视图中进行选择,但在指定时间之外不会得到任何结果。

如果您是 2016 年,您还可以在桌面上使用 row level security 来实现相同的目标。下面的例子

CREATE TABLE dbo.Client
  (
     clientId INT IDENTITY PRIMARY KEY,
     Name     VARCHAR(50)
  );

INSERT dbo.Client
VALUES ('client1'),
       ('client2');

CREATE USER Emily WITHOUT LOGIN;

GRANT SELECT ON dbo.Client TO Emily;

GO

CREATE SCHEMA Security;

GO

CREATE FUNCTION Security.EmilyTimeFilterPredicate()
RETURNS TABLE
WITH SCHEMABINDING
AS
    RETURN
      SELECT 1 AS fn_securitypredicate_result
      WHERE  USER_NAME() <> 'Emily'
              OR CAST(GETDATE() AS TIME) BETWEEN '09:00' AND '17:00';

GO

CREATE SECURITY POLICY EmilyTimeFilter  
ADD FILTER PREDICATE Security.EmilyTimeFilterPredicate()   
ON dbo.Client 
WITH (STATE = ON);  

GO

EXECUTE AS USER = 'Emily';

SELECT *
FROM   dbo.Client;

REVERT;

SELECT *
FROM   dbo.Client; 

GO

DROP SECURITY POLICY EmilyTimeFilter ;

DROP TABLE dbo.Client

DROP USER Emily

DROP FUNCTION Security.EmilyTimeFilterPredicate

DROP SCHEMA Security; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多