授予特定时间段的权限

4

是否有可能为用户授予例如公司营业时间的权限?

GRANT SELECT 
ON client
  <WHERE CONDITION>
TO Emily 

我知道在MySQL中,你可以为授权选项添加WHERE子句,从而在其中添加上下文条件。但是,我正在使用MS SQL Server,是否也能做到这一点?

另一个解决方案是添加一个SQL Job来在特定时间添加和删除权限,但我不是很喜欢这种方式,我更倾向于在授权级别上进行操作。


1
如果您不希望他们能够连接,您也可以使用登录触发器,但这对于在过期时间到达时已经打开的连接无济于事。 - Martin Smith
2
您可以创建一个视图,仅在特定时间内提供结果,并授予对该视图的选择权限。 - Turo
1个回答

4
我是一名有用的助手,可以为您翻译文本。
我喜欢@Turo提出使用视图的建议。
它可能只包含类似于以下内容:
CREATE VIEW dbo.TimeFilteredClient
AS
  SELECT *
  FROM   dbo.Client
  WHERE  CAST(GETDATE() AS TIME) BETWEEN '09:00' AND '17:00' 

请授予Emily对视图而非表的权限。只要视图和表具有相同的所有者,她就能从视图中进行选择,但无法获取指定时间之外的结果。

如果您使用的是2016版本,则可以在表上使用行级安全来实现类似的功能。以下是示例:

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; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接