Scripting object permissions independently
還沒有人認領這個 Issue。
評估
研究方向
未指定任何儲存庫檔案、測試或進入點;先在儲存庫中找出 ObjectPermissionInfo 以及現有的 scripting 或 permission API。將提議的 SQL Server 物件類別處理方式與目前的行為和文件進行比較,然後定義支援的情況和測試,再決定轉換是否完成。
由索引模型根據 Issue 內容生成。
描述
@shueybubbles I wrote this code awhile ago to integrate with SMO and overcome limitations in the built-in scripting engine (note the LOL). Can I get some initial feedback on how I can convert this into a PR? I am sure it's missing a bunch of edge cases.
public static class ObjectPermissionInfoExtensions
{
public static string ToSqlString(this ObjectPermissionInfo opi)
{
if (opi is null) throw new ArgumentNullException(nameof(opi));
string toTarget;
switch (opi.GranteeType)
{
case PrincipalType.None:
throw new Exception("What the heck happened?");
case PrincipalType.Login:
case PrincipalType.ServerRole:
case PrincipalType.User:
case PrincipalType.DatabaseRole:
case PrincipalType.ApplicationRole:
default:
toTarget = $"/*{opi.GranteeType}::*/[{opi.Grantee}]";
break;
};
string permissionedObjectExpression;
switch (opi.ObjectClass)
{
case ObjectClass.Database:
permissionedObjectExpression = $"ON {opi.ObjectClass}::[{opi.ObjectName}]";
break;
case ObjectClass.ObjectOrColumn:
// ex A: https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-object-permissions-transact-sql?view=sql-server-ver15#a-granting-select-permission-on-a-table
// ex B: https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-object-permissions-transact-sql?view=sql-server-ver15#b-granting-execute-permission-on-a-stored-procedure
permissionedObjectExpression = string.IsNullOrWhiteSpace(opi.ColumnName)
? $"ON OBJECT::[{opi.ObjectSchema}].[{opi.ObjectName}]"
: $"ON OBJECT::[{opi.ObjectSchema}].[{opi.ObjectName}]([{opi.ColumnName}])";
break;
case ObjectClass.Schema:
permissionedObjectExpression = $"ON {opi.ObjectClass}::[{opi.ObjectName}]";
break;
case ObjectClass.User:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-database-principal-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ON USER::[{opi.ObjectName}]";
break;
case ObjectClass.DatabaseRole:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-database-principal-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ON ROLE::[{opi.ObjectName}]";
break;
case ObjectClass.ApplicationRole:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-database-principal-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ON APPLICATION ROLE::[{opi.ObjectName}]";
break;
case ObjectClass.SqlAssembly:
permissionedObjectExpression = $"ASSEMBLY [{opi.ObjectName}]";
break;
case ObjectClass.UserDefinedType:
permissionedObjectExpression = $"ON TYPE::[{opi.ObjectSchema}].[{opi.ObjectName}]";
break;
case ObjectClass.SecurityExpression:
case ObjectClass.XmlNamespace:
case ObjectClass.MessageType:
case ObjectClass.ServiceContract:
case ObjectClass.Service:
case ObjectClass.RemoteServiceBinding:
case ObjectClass.ServiceRoute:
throw new Exception($"{opi.ObjectClass} is in set of object classes not supported.");
case ObjectClass.FullTextCatalog:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-full-text-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ON FULLTEXT CATALOG :: {opi.ObjectName}";
break;
case ObjectClass.SearchPropertyList:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-search-property-list-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ON SEARCH PROPERTY LIST :: {opi.ObjectName}";
break;
case ObjectClass.SymmetricKey:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-symmetric-key-permissions-transact-sql?view=sql-server-ver15#examples
permissionedObjectExpression = $"ON SYMMETRIC KEY {opi.ObjectName}";
break;
case ObjectClass.Server:
// This won't work for every SERVER permission, but it at least covers one scenario:
// ex A: https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-server-permissions-transact-sql?view=sql-server-ver15#a-granting-a-permission-to-a-login
permissionedObjectExpression = "SERVER";
break;
case ObjectClass.Login:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-server-principal-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ON LOGIN :: {opi.ObjectName}";
break;
case ObjectClass.ServerPrincipal:
throw new Exception("Not clear from documentation how to handle this. See: https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-server-principal-permissions-transact-sql?view=sql-server-ver15");
case ObjectClass.ServerRole:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-server-principal-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ON SERVER ROLE :: {opi.ObjectName}";
break;
case ObjectClass.Endpoint:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-endpoint-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ON ENDPOINT :: {opi.ObjectName}";
break;
case ObjectClass.Certificate:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-certificate-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ON CERTIFICATE :: {opi.ObjectName}";
break;
case ObjectClass.FullTextStopList:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-full-text-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"FULLTEXT STOPLIST :: {opi.ObjectName}";
break;
case ObjectClass.AsymmetricKey:
// https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-asymmetric-key-permissions-transact-sql?view=sql-server-ver15
permissionedObjectExpression = $"ASYMMETRIC KEY :: {opi.ObjectName}";
break;
case ObjectClass.AvailabilityGroup:
case ObjectClass.ExternalDataSource:
case ObjectClass.ExternalFileFormat:
default:
throw new Exception($"{opi.ObjectName} is in object class {opi.ObjectClass}, which is not a supported object class.");
}
var result =
$"{opi.PermissionState.ToString().ToUpper()} {opi.PermissionType} {permissionedObjectExpression} TO {toTarget}";
if (string.IsNullOrWhiteSpace(result))
System.Diagnostics.Debugger.Break(); // <-- LOL.
return result;
}
- 主要語言
- C#
- 星號
- 143
- 分支
- 28
- PR 合併指標
- 30 天內沒有已合併 PR
貢獻指南
這個儲存庫沒有索引到貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
microsoft/sqlmanagementobjects 的其他 Issue
-
難度 2/5 1-3 小時 新手友好度 62/100
-
難度 3/5 1-2 天 新手友好度 72/100
-
難度 4/5 3-5 天 新手友好度 74/100
-
難度 3/5 1-2 天 新手友好度 78/100
-
難度 3/5 1-2 天 新手友好度 68/100
查看 microsoft/sqlmanagementobjects 的全部 Issue
相似的 Issue
-
untriaged
難度 1/5 1 小時以內 新手友好度 88/100
dotnet/dotnet-api-docs#13095 ·
-
area-deployment area-integrations triage:bot-seen
難度 2/5 半天 新手友好度 86/100
-
type/automation type/tech-debt
難度 2/5 1-3 小時 新手友好度 84/100
-
bug
難度 1/5 1 小時以內 新手友好度 90/100
newrelic/newrelic-dotnet-agent#3850 · 1 則留言 ·
-
難度 2/5 1-3 小時 新手友好度 88/100
LuckyPennySoftware/AutoMapper#4660 ·