2013-10-14 71 views
0

我目前正在做一個需要檢查表的權限的vb.net程序(如果表不存在,那麼數據庫的權限,如果數據庫不存在,那麼權限到sql服務器)檢查表的權限

有沒有辦法檢查thouse權限,以及如何?

  • 我如何檢查表上的權限「testdb.testtable」爲 用戶「testuser的」
  • 我如何檢查數據庫「TESTDB」爲 用戶「testuser的」權限
  • 我如何檢查服務器的用戶「testuser的」

我一直在尋找在谷歌上的權限,但我得到的結果,是一個2頁長的SQL腳本。

+0

我覺得這裏的另一個問題是「爲什麼」?如果你沒有權限,你需要做一些具體的事情嗎?如果你所需要做的只是顯示一個合適的錯誤,那麼只要試着用'testdb.testtable'表來做你需要做的事情,SQL就會拋出一個錯誤,以及一個準確的錯誤信息和錯誤號你可以切換()以解決問題。 –

+0

我的想法是檢查表是否存在,如果存在,並且具有INSERT權限,則開始插入新行。然而,如果表不存在,那麼創建表(如果用戶有權修改數據庫)。如果數據庫不存在,則創建數據庫,如果用戶有權創建新數據庫。 這主要是爲了增加這個作爲初始嘗試,在開始發佈數據之前,爲了防止數據丟失 – Droa

回答

1

我會將創建數據庫的責任推到最終用戶上 - 並允許用戶指定該數據庫;安裝程序創建數據庫可能是有效的,但它也應該接受已由最終用戶提供名稱的已創建的數據庫。您不希望假設數據庫名稱,就好像最終用戶已經擁有使用該名稱創建的數據庫一樣,您將直接與其衝突。

也就是說,權限被存儲在sys.database_permissions中,它概述了用戶在數據庫中查詢的權限以及sys.server_permissions,以確定他們是否有能力創建數據庫。

雖然有益地的SQL Server有包裝了查詢權限的功能 - 在HAS_PERMS_BY_NAME功能就派上用場了這裏,例如:

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') 

...將看看如果當前用戶有能力'CREATE TABLE'在指定的數據庫中,而

SELECT HAS_PERMS_BY_NAME(null, null, 'CREATE ANY DATABASE') 

...會告訴你當前用戶是否可以創建數據庫。這些權限的名稱是您要通過GRANT的那些名稱。有關更多信息和示例,請參閱文檔。

+0

這看起來像我想到的相同結論。我需要記錄數據庫用戶權限的原因是因爲它是我創建的一個Windows服務,如果失敗,我最終用戶需要詳細瞭解什麼時候錯誤,以緩解挫折感。 謝謝你的例子 – Droa

0

我也能組裝另一個SQL查詢..但是如果用戶不能訪問數據庫,這將返回一個錯誤。

SELECT pe.*,object_name(pe.major_id), pr1.name as Grantee, pr2.name as Grantor, pr1.create_date,pr1.default_schema_name from sys.database_permissions as pe 
join sys.database_principals as pr1 on pe.grantee_principal_id = pr1.principal_id 
join sys.database_principals as pr2 on pe.grantor_principal_id = pr2.principal_id 
where pr1.name = CURRENT_USER 
go 

加入 「使用ReplaceWithNameOfDatabase」

查詢會問了針對數據庫。

我從來沒有真正與MSSQL合作過,只有MYSQL,並且似乎在存儲userlogin數據方面存在很大差異。

,我發現這個SQL Server: Permissions on table 工作對我來說,一點點修改