确定SQL Server表是否为只读
答
你的意思是除了试图写入它的权利?
答
--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'))
我使用属于public和db_datareader角色的帐户连接到数据库。证实它具有只读访问权限,并且这些查询都没有表明我拥有只读访问权限,从我所知道的情况来看。 – Rono 2010-04-08 02:34:17
从这个意义上说,如果连接是只读的,则无法检测到连接。我给出的第二个查询会告诉你public和db_datareader没有I/U/D权限,它们是相同的。 – gbn 2010-04-08 04:23:02
我应该看哪些列来确定?我在一个只读连接和一个可编辑连接上运行了第二个查询,我没有看到它们之间有用的区别。或者你说这是不可能的? – Rono 2010-04-18 02:34:34