Eu tenho um usuário em um banco de dados SQL Server 2014 que só tem permissões para inserir em uma tabela (sem permissões de seleção). Quando o rastreamento de alterações estiver ativado na tabela, as inserções falharão comThe SELECT permission was denied on the object ...
Por que este é o caso?
Passos para reproduzir:
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
*/
As operações de controle de alterações estão sendo executadas no contexto do usuário e, para rastrear o que está sendo alterado, ele deve ler a linha usando um SELECT antes de ser alterado.