db_datareader 用户可以阻止 ALTER TABLE 语句吗?

Pol*_*ldi 5 sql-server permissions transaction

db_datareader 用户尝试更新并收到错误:

BEGIN TRAN

UPDATE [TestDB].[dbo].[Table_1]
  SET Col1 = 'Test';

   Msg 229, Level 14, State 5, Line 3
The UPDATE permission was denied on the object 'Table_1', database 'TestDB', schema 'dbo'.
Run Code Online (Sandbox Code Playgroud)

用户不关闭会话。

具有足够权限的用户之后尝试更改表并被阻止:

BEGIN TRAN

ALTER TABLE [TestDB].[dbo].[Table_1]
ADD Col2 INT;
Run Code Online (Sandbox Code Playgroud)

执行查询..

在此处输入图片说明 这是正常行为吗?

Jam*_*son 4

是的。第一个查询留下了一个未完成的事务。SQL Server 在编译时不会检查当前用户是否具有权限。它会在运行时发现。如果您正在编写存储过程,您不会希望在编译时检查权限,因为不同的用户可能会执行该过程。

将两个查询中的 UPDATE 包装在 TRY CATCH 中将避免留下打开的事务。

BEGIN TRY
    BEGIN TRAN

    UPDATE [TestDB].[dbo].[Table_1]
      SET Col1 = 'Test';

    COMMIT TRAN
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK;

    ;THROW;
END CATCH
Run Code Online (Sandbox Code Playgroud)