确定SQL Server表是否为只读

问题描述:

由于帐户权限或数据库被标记为只读,确定给定SQL Server表是否为只读的最佳方式是什么?确定SQL Server表是否为只读

你的意思是除了试图写入它的权利?

在SQL Server的Information Schema Views,特别是,TABLE_PRIVILEGES有一个翻身。

--for database (updated for newer versions) 
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability') 

--for tables. 
SELECT 
    * 
FROM 
    sys.tables t 
    LEFT JOIN 
    sys.database_permissions dp2 ON dp2.major_id = t.object_id AND dp2.permission_name = 'SELECT' 
WHERE 
    NOT EXISTS (SELECT * FROM 
     sys.database_permissions dp 
     WHERE 
     dp.major_id = t.object_id 
     AND 
     dp.permission_name IN ('INSERT', 'DELETE', 'UPDATE')) 

修改*如需要得到你想要的东西:这个检查无/ SELECT那里没有I/U/d权利

你也有FILEGROUPPROPERTY等,如果您有只读文件组

编辑:用于当前连接和每个用户的直接表权限。不通过组层级迭代

SELECT 
    * 
FROM 
    sys.tables t 
    JOIN 
    sys.database_permissions dp2 ON dp2.major_id = t.object_id AND dp2.permission_name = 'SELECT' 
WHERE 
    dp2.grantee_principal_id = USER_ID() 
    AND 
    dp.permission_name IN ('INSERT', 'DELETE', 'UPDATE')) 
+0

我使用属于public和db_datareader角色的帐户连接到数据库。证实它具有只读访问权限,并且这些查询都没有表明我拥有只读访问权限,从我所知道的情况来看。 – Rono 2010-04-08 02:34:17

+0

从这个意义上说,如果连接是只读的,则无法检测到连接。我给出的第二个查询会告诉你public和db_datareader没有I/U/D权限,它们是相同的。 – gbn 2010-04-08 04:23:02

+0

我应该看哪些列来确定?我在一个只读连接和一个可编辑连接上运行了第二个查询,我没有看到它们之间有用的区别。或者你说这是不可能的? – Rono 2010-04-18 02:34:34