Sql-Server

如何防止刪除表但允許在模式中創建它們

  • February 24, 2020

是否可以在特定架構中允許使用者創建表並從中進行選擇,但不允許他們在初始創建後刪除或更新行,並防止他們刪除它?

Create Table as Select需要 Select 的 select 權限,但是Create Table需要 Create table 和 Alter Schema on Schema。

Alter Schema 權限還包括刪除表的權限,這是我們不想要的。

我們正在使用 Azure SQL 數據倉庫,所以不能使用觸發器..

擴展@Dominique Boucher 的建議。

您可以通過創建一個充當 create 語句代理的過程並在其中指定一個 execute as 子句來做到這一點。如果您然後只允許您想要的使用者執行權限,他們只能創建表,不能編輯它們。這種方式不會成為所有者(以使用者身份執行成為所有者)並且他們不能編輯過程本身。

GRANT EXECUTE ON [dbo].[TableBuilder] TO [Plebby]

下面是一個範例,帶有一些檢查/錯誤處理,但您需要對其進行擴展以滿足您的需求。您將在具有高度特權的使用者上創建此過程。

CREATE PROCEDURE TableBuilder
@schemaName sysname,
@tableName sysname,
@tableScript nvarchar(max)
WITH EXECUTE AS 'dbo'
AS
BEGIN
DECLARE @ErrorMessage NVARCHAR(4000);

IF SCHEMA_ID(@schemaName) IS NULL
BEGIN
   SET @ErrorMessage = 'Schema with name ' + @schemaName + ' does not exist.';
   RAISERROR(@ErrorMessage, 16, 0);
   RETURN
END

IF OBJECT_ID(@schemaName + '.' + @tableName, 'U') IS NOT NULL
BEGIN
   SET @ErrorMessage = 'Defined table ' + @schemaName + '.' + @tableName + ' already exists';
   RAISERROR(@ErrorMessage, 16, 0)
   RETURN
END

IF (@schemaName + '.' + @tableName <> (SELECT SUBSTRING(@tableScript, (CHARINDEX('TABLE', @tableScript) + 6), (LEN(@schemaName) + LEN(@tableName) + 1))))
BEGIN
   SET @ErrorMessage = 'Schema and/or tablenames in creation script do not match with ' + @schemaName + '.' + @tableName;
   RAISERROR(@ErrorMessage, 16, 0)
   RETURN
END

EXEC(@tableScript)

RETURN 0
END

對上述過程具有執行權限的使用者可以使用它來執行有效的 CREATE TABLE 語句。並且您可以添加更多檢查/約束(即允許的模式)。並且應該這樣做,因為執行是動態 SQL。根據您的使用者權限:

以“使用者”身份執行

如果您不控制輸入,您可能會獲得一些令人討厭的權利升級。我已經在 SQL Server 2008、2012 和 2017 上測試了上述過程。但我沒有可用於測試的 AzureDB 實例。

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