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)
执行查询..
是的。第一个查询留下了一个未完成的事务。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)
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |