در دو مقاله قبل (بخش اول و بخش دوم) با RLS و نحوه استفاده از آن در SQL Server 2016 آشنا شدیم. در ادامه قصد دارم چند نکته را که باید پیش از استفاده از RLS و هر گونه پیاده سازی از آنها آگاهی داشته باشیم، مورد بررسی قرار دهم. با توجه به اینکه RLS در SQL Server 2016 معرفی شده است، دارای محدودیت هایی نیز هست. در ادامه قصد داریم با این محدودیت ها آشنا شده و برخی از کارهایی را که می توان برای کم کردن یا جبران این محدودیت ها انجام داد(در برخی موارد) را ارائه دهیم. البته باید این نکته را هم بگویم که برخی از این محدودیت ها موقتی هستند و با ارائه نسخه نهایی SQL Server 2016 بر طرف خواهند شد(نسخه استفاده شده در زمان نگارش CTP 2.2).


[sql] EXECUTE AS USER = N’Peon’; DECLARE @ci VARBINARY(128) = CONVERT(VARBINARY(128),N’Rep1′); REVERT; |
[sql] EXECUTE AS USER = N’Peon’; DECLARE @i INT = 1; REVERT; |
[sql] GRANT INSERT, UPDATE ON dbo.Accounts TO Rep1; EXEC(‘INSERT dbo.Accounts(AccountID,AnnualFees,RepID) |
[sql] EXEC(‘SELECT * FROM dbo.Accounts WHERE AccountID = 99;’) AS USER = N’Rep1′; |
[sql] EXEC(‘UPDATE dbo.Accounts SET AnnualFees*=2 WHERE AccountID = 99;’) AS USER = N’Rep1′; |
[sql] CREATE TABLE dbo.AccountReps CREATE USER Rep1 WITHOUT LOGIN; CREATE ROLE RepManagers; INSERT dbo.AccountReps(RepID, SQLPrincipalName) CREATE TABLE dbo.Accounts INSERT dbo.Accounts(AccountID,AnnualFees,RepID) GRANT SELECT ON dbo.Accounts TO Peon, Rep1, Rep2, Rep3, Susan; CREATE USER sqlapp WITHOUT LOGIN; ————————————————– CREATE FUNCTION dbo.LimitAccountAccess(@RepID INT) CREATE SECURITY POLICY AccountAndRepPolicy DECLARE @ci VARBINARY(128) = CONVERT(VARBINARY(128),N’Rep1′); REVERT; |
[sql] — Create SampleUser table — Create SampleData table and foreign key to SampleUser table — Load SampleUser table — Load SampleData table — create indexes |
[sql] — sysadmin user — regular user |
[sql] — run using test_sa account — query 2 — run using User10 account — query 4 |
[sql] CREATE FUNCTION dbo.fn_securitypredicateUser (@UserID int) CREATE SECURITY POLICY fn_security |
[sql] — run using test_sa account — query 2 — run using User10 account — query 4 |

