Sql-Server
如何防止刪除表但允許在模式中創建它們
是否可以在特定架構中允許使用者創建表並從中進行選擇,但不允許他們在初始創建後刪除或更新行,並防止他們刪除它?
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 實例。