授予一天中特定时间的权限
Grant permissions for specific time of day
是否可以授予用户权限,比如公司的营业时间。
GRANT SELECT
ON client
<WHERE CONDITION>
TO Emily
我知道用 MySQL 可以做到这一点,您可以在授权选项中添加 WHERE
子句,以便您可以向其添加上下文条件。但是,我正在使用 MS SQL 服务器,可以在那里完成吗?
另一种解决方案是添加一个 SQL 作业以在特定时间添加和删除权限,但我不太喜欢那样,我更愿意在授予级别上执行此操作。
我喜欢@Turo关于使用视图的建议。
它可以只包含类似
的内容
CREATE VIEW dbo.TimeFilteredClient
AS
SELECT *
FROM dbo.Client
WHERE CAST(GETDATE() AS TIME) BETWEEN '09:00' AND '17:00'
然后授予 Emily 视图权限,而不是 table。只要视图和 table 共享同一所有者,她就可以从视图中 select 但在指定时间之外得不到任何结果。
如果你在 2016 年,你也可以在 table 上使用 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;
是否可以授予用户权限,比如公司的营业时间。
GRANT SELECT
ON client
<WHERE CONDITION>
TO Emily
我知道用 MySQL 可以做到这一点,您可以在授权选项中添加 WHERE
子句,以便您可以向其添加上下文条件。但是,我正在使用 MS SQL 服务器,可以在那里完成吗?
另一种解决方案是添加一个 SQL 作业以在特定时间添加和删除权限,但我不太喜欢那样,我更愿意在授予级别上执行此操作。
我喜欢@Turo关于使用视图的建议。
它可以只包含类似
的内容CREATE VIEW dbo.TimeFilteredClient
AS
SELECT *
FROM dbo.Client
WHERE CAST(GETDATE() AS TIME) BETWEEN '09:00' AND '17:00'
然后授予 Emily 视图权限,而不是 table。只要视图和 table 共享同一所有者,她就可以从视图中 select 但在指定时间之外得不到任何结果。
如果你在 2016 年,你也可以在 table 上使用 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;