2017-08-04 48 views
9

我想用下面的命令設置數據庫爲只讀模式,它的工作原理。數據庫只讀,但只有幾個表可寫

ALTER DATABASE [TESTDB] SET READ_ONLY WITH NO_WAIT 

但是,我需要只允許像UserSession等幾個表是可寫的。 這可能嗎?

我們在數據庫中有大約500多個表,我們只需要允許4個表是可寫的。

+2

https://stackoverflow.com/questions/2529839/how-to-make-a-table-read-only-in-sql-server – MatSnow

+0

@MatSnow的可能的複製,我們在各地的500多個表數據庫,我們只需要允許4個表是可寫的。我是否應該添加496只讀而不是將整個數據庫設置爲只讀,並且只允許4個可寫? – Developer

+2

如果將數據庫設置爲只讀,則AFAIK無法將僅少數表設置爲可寫。我建議你設置適合你需求的權限。 – MatSnow

回答

5

你可以否認INSERTUPDATEDELETEpublic角色,如:

DENY UPDATE ON tab1 TO public 
DENY INSERT ON tab1 TO public 
DENY DELETE ON tab1 TO public 

之後,普通用戶(非系統管理員)將獲得試圖插入到TAB1時出現錯誤:

INSERT INTO tab1 (id) VALUES (1) 

--Msg 229, Level 14, State 5, Line 20 
--The INSERT permission was denied on the object 'tab1', database 'test', schema 'dbo'. 

如果您願意將其添加到數據庫中,那麼您可以生成腳本來更改所有表格,如:

EXEC sp_msforeachtable ' 
PRINT '' 
    DENY UPDATE ON ? TO public 
    DENY INSERT ON ? TO public 
    DENY DELETE ON ? TO public 
'' 
' 

確保你不否認寫入那些仍然需要寫入的4個表。

不確定您的應用程序,但如果您不想拒絕public角色的權限,您可以考慮創建自己的角色,拒絕對該角色的訪問,並讓用戶成爲該角色的一部分。

希望它是有道理的。

+0

如果有人使用DDL命令(TRUNCATE/ALTER/DROP)會怎麼樣? – lad2025

+0

普通用戶通常不具有這些權利。但是,如果是這種情況,那麼您可以使用更多的DENY權限來限制它,或者如果更改數據庫模式的選項可用,則可以使用數據庫觸發器(例如:不是您無法更改的第三方數據庫) – Horia

+0

Still你不能否認擁有對象所有者的權利,而且你必須重新考慮爲所有新用戶這樣做。真正只讀是在數據庫或文件組級別。' – lad2025

1

您可以使用這樣的事情:

ALTER TABLE [schemaName].[tableName] READ ONLY ON|OFF 
+0

我認爲這是特定於Oracle(11g),而問題涉及到MSSQL。 – Horia

0

您可以在數據庫中創建新模式,例如upd 現在你可以給閱讀&寫權限爲架構應該有能力向特定的用戶修改數據。 之後,您可以創建要更新

create view upd.Tab1 
as 
select * from dbo.Tab1 
GO 

在模式upd對象只將是可寫的用戶權限的upd架構基於表更新/插入意見。

5

我的建議是將兩種類型的表格存儲在不同的模式中 - 比如readablewritable

當SQL Server在2005年推出的模式,在idea是模式是一個單位的安全和數據庫備份和恢復的單位:

的Microsoft SQL Server 2005中引入的數據庫對象 模式的概念。模式類似於用於存儲數據庫對象的獨立名稱空間或容器 。安全權限適用於模式, 使它們成爲根據訪問權限分離和保護數據庫的重要工具。

這將使兩種不同的架構成爲您數據架構的有力競爭者。

換句話說,將readable架構設置爲read_only。並將其他表格放在writable模式中。

+0

這在某些情況下有效。但數據庫中的實際數據永遠不會只讀。擁有足夠權限的用戶仍然可以使用「可讀」模式更改數據。例如,sysAdmin將能夠直接更改數據。 –

+0

@ChamikaGoonetilaka。 。 。當然,您可以根據應用程序的需要調整權限。 「可讀」和「可寫」可能不是最好的名字。 –

+1

@ChamikaGoonetilaka你的論點是有缺陷的。系統管理員總是能夠使數據庫成爲可寫的。無論你做什麼訪問的人都不是某人你可以停下來,因此安全是一個不是絕對的計劃。 – Namphibian

3

您可以通過將可寫表移動到單獨的文件組並將其他文件組只讀取進行存檔。

第一步 - 創建一個不同的文件組

ALTER DATABASE TESTDB ADD FILEGROUP Writable_FG; 

第二步 - 數據文件添加到新的文件組

ALTER DATABASE TESTDB ADD FILE (
    NAME = JeanAnn2, 
    FILENAME = 'D:\MSSQL\TESTDB_Writable_FG_01.ndf', 
    SIZE = 6MB, 
    MAXSIZE = 18MB, 
    FILEGROWTH = 1 
) TO FILEGROUP Writable_FG; 

第三步 - 將你所需要的表寫入新文件組

爲此,您需要在新文件組上重新創建表的聚簇索引。

CREATE CLUSTERED INDEX CIX_YourTable 
ON dbo.YourTable(YourClusteringKeyFields) 
WITH DROP_EXISTING 
ON [Writable_FG] 

,或者如果您的聚集索引是獨特

CREATE UNIQUE CLUSTERED INDEX CIX_YourTable 
ON dbo.YourTable(YourClusteringKeyFields) 
WITH DROP_EXISTING 
ON [Writable_FG] 

執行此操作,你需要是可寫的所有四個表。

第四步 - 使其他文件組只讀

ALTER DATABASE TESTDB MODIFY FILEGROUP [PRIMARY] READ_ONLY; 

這裏,假定其他文件組是主。

0

你可以把4個表放在一個不同的數據庫上,而你的數據庫 把一個同義詞放到你想要更新的4個表中。

CREATE SYNONYM sessionTables 
SELECT * 
FROM WriteableDatabase.dbo.sessionTables 
相關問題