1

我有一個SQL Server 2005上運行的數據庫,它具有用戶定義的數據類型。用戶定義的數據類型也在模型數據庫中實現,所以當我創建臨時表時,我可以使用相同的用戶定義數據類型。SQL Server 2005用戶定義的數據類型,tempdb和權限

例如,在AppDB我有這樣的數據類型定義:

CREATE TYPE [dbo].[ product_code] FROM [varchar](8) NULL 

,並在型號完全相同的:

CREATE TYPE [dbo].[ product_code] FROM [varchar](8) NULL 

我發現,如果我的數據庫實例的安全登錄有sysadmin服務器角色,那麼用戶在使用product_code數據類型調用在tempdb中創建表的存儲過程時沒有問題 - 但是如果我從應用程序安全登錄中刪除了sysadmin,那麼存儲過程調用將失敗。

如果我始終用varchar系統數據類型替換用戶定義的數據類型,那麼相同的存儲過程調用會成功。

出於安全原因,我不想將sysadmin服務器角色添加到應用程序安全登錄名 - 如果我想繼續使用用戶定義的數據類型,我有什麼選擇?這些選項是否隨着SQL Server 2008而改變?

具體來說,除了那些授予public角色的權限之外,還需要什麼權限?需要編輯所有存儲過程的答案將被視爲無響應。

+0

用戶在AppDB中擁有什麼權限?例如他們可以用這種數據類型創建一個* local *表嗎? – 2012-03-04 19:52:07

+1

此外,您可能會發現這篇博文很有用。從長遠來看,圍繞你的類型的文檔將比使用別名類型強制執行它的麻煩少得多。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/14/bad-habits-to-kick-using-alias-types.aspx – 2012-03-04 20:02:48

+0

感謝您的文章鏈接 - 我已轉發此給我們的系統架構師進行審查。我剛剛將用戶添加到了db_ddladmin固定用戶角色,問題已解決 - 這是正確的做法嗎?我認爲這比將用戶添加到系統管理員角色更好 - 但我承認我對這個東西不太瞭解。 – 2012-03-04 21:06:57

回答

1

用戶定義的數據類型(又名別名)問題和tempdb的是第一用戶定義的數據類型必須在模型數據庫,這是因爲已完成正確這裏被定義。但是,必須授予操作這些對象的權限 - 執行此操作的合理方法是將db_ddladmin角色成員資格授予模型。當SQL Server服務重新啓動時,創建的tempdb將「繼承」角色成員資格。如果不希望重新啓動SQL Server,請繼續將db_ddladmin角色成員資格直接授予應用程序用戶的tempdb

以編程方式添加的db_ddladmin角色名爲「MyAppUser」的模式爲用戶:

USE [model] 
GO 
EXEC sp_addrolemember N'db_ddladmin', N'MyAppUser' 
GO 

要非常清楚,db_ddladmin固定的用戶角色並不需要添加到應用程序數據庫,只有模型。

-1

應該沒有必要在tempdb中創建一個uddt。如果你想匹配您的臨時表的數據類型,使用方法:

select fieldx, fieldy into #temptable from sourcetable 

或使用:

declare @fieldx product_code 

select @fieldx into #temptable 

這樣,這些字段大小相匹配,也沒有權限問題。

如果你想在tempdb中創建永久表...我的建議是爲這些表創建一個特定的數據庫。

相關問題