是否有可能为用户授予例如公司营业时间的权限?
GRANT SELECT
ON client
<WHERE CONDITION>
TO Emily
我知道在MySQL中,你可以为授权选项添加WHERE
子句,从而在其中添加上下文条件。但是,我正在使用MS SQL Server,是否也能做到这一点?
另一个解决方案是添加一个SQL Job来在特定时间添加和删除权限,但我不是很喜欢这种方式,我更倾向于在授权级别上进行操作。
是否有可能为用户授予例如公司营业时间的权限?
GRANT SELECT
ON client
<WHERE CONDITION>
TO Emily
我知道在MySQL中,你可以为授权选项添加WHERE
子句,从而在其中添加上下文条件。但是,我正在使用MS SQL Server,是否也能做到这一点?
另一个解决方案是添加一个SQL Job来在特定时间添加和删除权限,但我不是很喜欢这种方式,我更倾向于在授权级别上进行操作。
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;