2017-07-01 22 views
4

会社の営業時間などの権利をユーザーに与えることは可能ですか?特定の時刻に許可を付与する

GRANT SELECT 
ON client 
    <WHERE CONDITION> 
TO Emily 

私はこのようなものは、あなたがそれにコンテキスト条件を追加することができますので、あなたがグラントオプションへWHERE句を追加することができますMySQLのでこれを行うことが可能です知っています。しかし、私はMS SQL Serverで作業していますが、そこで実行できますか?

もう1つの解決策は、SQLジョブを追加して特定の時間に権限を削除することですが、私はそれが本当に気に入らないので、許可レベルでこれを行うことをお勧めします。

+1

以下の実施例はまた、[ログオントリガ]を使用することができます(https://msdn.microsoft.com/en-us/library/bb326598(V = SQL.105).aspxの)あなたがいない場合それらが完全に接続できるようにしたい - ただし、有効期限が過ぎても既に開いている接続を強制終了することはできません。 –

+2

ビューで許可を選択した特定の時間にのみ結果を返すビューを作成できます – Turo

答えて

4

私は@Turoさんのビューの使用が好きです。

それだけでは、ビューではなく、テーブルの上にエミリーの権限を付与

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

のようなもので構成されてできました。ビューとテーブルが同じ所有者を共有している限り、ビューから選択することはできますが、指定した時間外には結果は得られません。

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; 
関連する問題