Sql-Server

當我啟用更改跟踪時,為什麼我的 INSERT 在 SELECT 權限上失敗?

  • June 29, 2018

我在 SQL Server 2014 數據庫中有一個使用者,該使用者只有插入表的權限(沒有選擇權限)。在表上啟用更改跟踪時,插入將失敗The SELECT permission was denied on the object ...

為什麼會這樣?

重現步驟:

USE [master];
CREATE DATABASE insert_test;
GO
USE insert_test;
GO
CREATE TABLE dbo.test(id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, value NVARCHAR(50));
ALTER DATABASE insert_test SET CHANGE_TRACKING=ON;
ALTER TABLE dbo.test ENABLE CHANGE_TRACKING;
GO
CREATE LOGIN test_user WITH PASSWORD='FD3nIk1p(4$LKH!eSY';
CREATE USER test_user FOR LOGIN test_user;
GRANT INSERT ON dbo.test TO test_user;
GO
EXECUTE AS USER='test_user';
INSERT INTO dbo.test(value) VALUES(N'hello');  -- Fails with: The SELECT permission was denied on the object 'test', database 'insert_test', schema 'dbo'

/*
-- Cleanup
USE [master];
GO
DROP DATABASE insert_test;
GO
DROP LOGIN test_user;
GO
*/

更改跟踪操作在使用者的上下文中執行,為了跟踪正在更改的內容,必須在更改之前使用 SELECT 讀取行。

引用自:https://dba.stackexchange.com/questions/210920